Files
openbios/arch/sparc32/call-romvec.S
Mark Cave-Ayland d92b811c6e Use wrappers around all romvec functions on SPARC32 to flush register window and preserve global registers.
This appears to resolve issues with OpenBIOS crashing when calling OBP functions through the romvec interface due to 
stack/register issues. Note that this patch also implements pv_printf() and pv_putstr() which appears to fix issues with 
displaying error messages during Solaris 8 boot.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@siriusit.co.uk>


git-svn-id: svn://coreboot.org/openbios/trunk/openbios-devel@918 f158a5a8-5612-0410-a976-696ce0be7e32
2010-10-24 19:55:27 +00:00

93 lines
2.2 KiB
ArmAsm

#include "psr.h"
#include "asm/asi.h"
.text
.align 4
#define STACKFRAME_SZ 0x60
/* These are just handy. */
#define _SV save %sp, -STACKFRAME_SZ, %sp
#define _RS restore
#define FLUSH_ALL_KERNEL_WINDOWS \
_SV; _SV; _SV; _SV; _SV; _SV; _SV; \
_RS; _RS; _RS; _RS; _RS; _RS; _RS;
/* Macro for romvec handlers */
#define ROMVEC_HANDLER(type) \
\
.globl type##_handler; \
\
type##_handler: \
\
FLUSH_ALL_KERNEL_WINDOWS; \
\
save %sp, -STACKFRAME_SZ - 0x20, %sp; \
\
st %g1, [ %sp + STACKFRAME_SZ + 0x0]; \
st %g2, [ %sp + STACKFRAME_SZ + 0x4]; \
st %g3, [ %sp + STACKFRAME_SZ + 0x8]; \
st %g4, [ %sp + STACKFRAME_SZ + 0xc]; \
st %g5, [ %sp + STACKFRAME_SZ + 0x10]; \
st %g6, [ %sp + STACKFRAME_SZ + 0x14]; \
st %g7, [ %sp + STACKFRAME_SZ + 0x18]; \
\
mov %i0, %o0; \
mov %i1, %o1; \
mov %i2, %o2; \
mov %i3, %o3; \
mov %i4, %o4; \
mov %i5, %o5; \
\
call type; \
nop; \
\
mov %o0, %i0; \
\
ld [ %sp + STACKFRAME_SZ + 0x0], %g1; \
ld [ %sp + STACKFRAME_SZ + 0x4], %g2; \
ld [ %sp + STACKFRAME_SZ + 0x8], %g3; \
ld [ %sp + STACKFRAME_SZ + 0xc], %g4; \
ld [ %sp + STACKFRAME_SZ + 0x10], %g5; \
ld [ %sp + STACKFRAME_SZ + 0x14], %g6; \
ld [ %sp + STACKFRAME_SZ + 0x18], %g7; \
\
ret; \
restore; \
/* Generate handlers which are proxy functions to the
real C functions that correctly save the globals
and stack */
ROMVEC_HANDLER(obp_devopen)
ROMVEC_HANDLER(obp_devclose)
ROMVEC_HANDLER(obp_rdblkdev)
ROMVEC_HANDLER(obp_nbgetchar)
ROMVEC_HANDLER(obp_nbputchar)
ROMVEC_HANDLER(obp_putstr)
ROMVEC_HANDLER(obp_printf)
ROMVEC_HANDLER(obp_reboot)
ROMVEC_HANDLER(obp_abort)
ROMVEC_HANDLER(obp_halt)
ROMVEC_HANDLER(obp_fortheval_v2)
ROMVEC_HANDLER(obp_inst2pkg)
ROMVEC_HANDLER(obp_dumb_memalloc)
ROMVEC_HANDLER(obp_dumb_memfree)
ROMVEC_HANDLER(obp_dumb_mmap)
ROMVEC_HANDLER(obp_dumb_munmap)
ROMVEC_HANDLER(obp_devread)
ROMVEC_HANDLER(obp_devwrite)
ROMVEC_HANDLER(obp_devseek)
ROMVEC_HANDLER(obp_cpustart)
ROMVEC_HANDLER(obp_cpustop)
ROMVEC_HANDLER(obp_cpuidle)
ROMVEC_HANDLER(obp_cpuresume)
ROMVEC_HANDLER(obp_nextnode)
ROMVEC_HANDLER(obp_child)
ROMVEC_HANDLER(obp_proplen)
ROMVEC_HANDLER(obp_getprop)
ROMVEC_HANDLER(obp_setprop)
ROMVEC_HANDLER(obp_nextprop)