Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / openbios / arch / sparc32 / call-romvec.S
diff --git a/qemu/roms/openbios/arch/sparc32/call-romvec.S b/qemu/roms/openbios/arch/sparc32/call-romvec.S
new file mode 100644 (file)
index 0000000..be77b23
--- /dev/null
@@ -0,0 +1,94 @@
+#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)
+