sh: Tidy up the sh bios VBR handling.
This moves the VBR handling out of the main trap handling code and in to the sh-bios helper code. A couple of accessors are added in order to permit other kernel code to get at the VBR value for state save/restore paths. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
@@ -31,6 +31,7 @@
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/fpu.h>
|
||||
#include <asm/kprobes.h>
|
||||
#include <asm/sh_bios.h>
|
||||
|
||||
#ifdef CONFIG_CPU_SH2
|
||||
# define TRAP_RESERVED_INST 4
|
||||
@@ -876,35 +877,10 @@ asmlinkage void do_exception_error(unsigned long r4, unsigned long r5,
|
||||
die_if_kernel("exception", regs, ex);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_SH_STANDARD_BIOS)
|
||||
void *gdb_vbr_vector;
|
||||
|
||||
static inline void __init gdb_vbr_init(void)
|
||||
{
|
||||
register unsigned long vbr;
|
||||
|
||||
/*
|
||||
* Read the old value of the VBR register to initialise
|
||||
* the vector through which debug and BIOS traps are
|
||||
* delegated by the Linux trap handler.
|
||||
*/
|
||||
asm volatile("stc vbr, %0" : "=r" (vbr));
|
||||
|
||||
gdb_vbr_vector = (void *)(vbr + 0x100);
|
||||
printk("Setting GDB trap vector to 0x%08lx\n",
|
||||
(unsigned long)gdb_vbr_vector);
|
||||
}
|
||||
#endif
|
||||
|
||||
void __cpuinit per_cpu_trap_init(void)
|
||||
{
|
||||
extern void *vbr_base;
|
||||
|
||||
#ifdef CONFIG_SH_STANDARD_BIOS
|
||||
if (raw_smp_processor_id() == 0)
|
||||
gdb_vbr_init();
|
||||
#endif
|
||||
|
||||
/* NOTE: The VBR value should be at P1
|
||||
(or P2, virtural "fixed" address space).
|
||||
It's definitely should not in physical address. */
|
||||
@@ -959,6 +935,9 @@ void __init trap_init(void)
|
||||
set_exception_table_vec(TRAP_UBC, break_point_trap);
|
||||
#endif
|
||||
|
||||
/* Save off the BIOS VBR, if there is one */
|
||||
sh_bios_vbr_init();
|
||||
|
||||
/* Setup VBR for boot cpu */
|
||||
per_cpu_trap_init();
|
||||
}
|
||||
|
Reference in New Issue
Block a user