#define __ASSEMBLY #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) ROMVEC_HANDLER(obp_memalloc)