Skip to content

Commit

Permalink
sh: sh_bios detection.
Browse files Browse the repository at this point in the history
This adds some VBR sanity checks in the sh_bios code to ensure that the
BIOS VBR is in range before blindly trapping in to it. This permits
boards with varying boot loader configurations to always leave support
for sh-bios enabled and it will just be disabled at run-time if not
found.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
  • Loading branch information
Paul Mundt committed Jan 12, 2010
1 parent a99eae5 commit 94cd049
Showing 1 changed file with 11 additions and 4 deletions.
15 changes: 11 additions & 4 deletions arch/sh/kernel/sh_bios.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
#define BIOS_CALL_SHUTDOWN 11
#define BIOS_CALL_GDB_DETACH 0xff

void *gdb_vbr_vector = NULL;

static inline long sh_bios_call(long func, long arg0, long arg1, long arg2,
long arg3)
{
Expand All @@ -32,6 +34,9 @@ static inline long sh_bios_call(long func, long arg0, long arg1, long arg2,
register long r6 __asm__("r6") = arg2;
register long r7 __asm__("r7") = arg3;

if (!gdb_vbr_vector)
return -ENOSYS;

__asm__ __volatile__("trapa #0x3f":"=z"(r0)
:"0"(r0), "r"(r4), "r"(r5), "r"(r6), "r"(r7)
:"memory");
Expand Down Expand Up @@ -60,8 +65,6 @@ void sh_bios_shutdown(unsigned int how)
sh_bios_call(BIOS_CALL_SHUTDOWN, how, 0, 0, 0);
}

void *gdb_vbr_vector = NULL;

/*
* Read the old value of the VBR register to initialise the vector
* through which debug and BIOS traps are delegated by the Linux trap
Expand All @@ -76,8 +79,12 @@ void sh_bios_vbr_init(void)

__asm__ __volatile__ ("stc vbr, %0" : "=r" (vbr));

gdb_vbr_vector = (void *)(vbr + 0x100);
printk(KERN_NOTICE "Setting GDB trap vector to %p\n", gdb_vbr_vector);
if (vbr) {
gdb_vbr_vector = (void *)(vbr + 0x100);
printk(KERN_NOTICE "Setting GDB trap vector to %p\n",
gdb_vbr_vector);
} else
printk(KERN_NOTICE "SH-BIOS not detected\n");
}

/**
Expand Down

0 comments on commit 94cd049

Please sign in to comment.