summaryrefslogtreecommitdiffstats
path: root/qemu/roms/openbios/arch/sparc64
diff options
context:
space:
mode:
authorRajithaY <rajithax.yerrumsetty@intel.com>2017-04-25 03:31:15 -0700
committerRajitha Yerrumchetty <rajithax.yerrumsetty@intel.com>2017-05-22 06:48:08 +0000
commitbb756eebdac6fd24e8919e2c43f7d2c8c4091f59 (patch)
treeca11e03542edf2d8f631efeca5e1626d211107e3 /qemu/roms/openbios/arch/sparc64
parenta14b48d18a9ed03ec191cf16b162206998a895ce (diff)
Adding qemu as a submodule of KVMFORNFV
This Patch includes the changes to add qemu as a submodule to kvmfornfv repo and make use of the updated latest qemu for the execution of all testcase Change-Id: I1280af507a857675c7f81d30c95255635667bdd7 Signed-off-by:RajithaY<rajithax.yerrumsetty@intel.com>
Diffstat (limited to 'qemu/roms/openbios/arch/sparc64')
-rw-r--r--qemu/roms/openbios/arch/sparc64/boot.c130
-rw-r--r--qemu/roms/openbios/arch/sparc64/boot.h35
-rw-r--r--qemu/roms/openbios/arch/sparc64/build.xml72
-rw-r--r--qemu/roms/openbios/arch/sparc64/builtin.c33
-rw-r--r--qemu/roms/openbios/arch/sparc64/call-client.S118
-rw-r--r--qemu/roms/openbios/arch/sparc64/console.c68
-rw-r--r--qemu/roms/openbios/arch/sparc64/const.h19
-rw-r--r--qemu/roms/openbios/arch/sparc64/context.c133
-rw-r--r--qemu/roms/openbios/arch/sparc64/context.h33
-rw-r--r--qemu/roms/openbios/arch/sparc64/cpustate.h244
-rw-r--r--qemu/roms/openbios/arch/sparc64/entry.S287
-rw-r--r--qemu/roms/openbios/arch/sparc64/init.fs61
-rw-r--r--qemu/roms/openbios/arch/sparc64/ldscript72
-rw-r--r--qemu/roms/openbios/arch/sparc64/lib.c508
-rw-r--r--qemu/roms/openbios/arch/sparc64/linux_load.c653
-rw-r--r--qemu/roms/openbios/arch/sparc64/lsu.h20
-rw-r--r--qemu/roms/openbios/arch/sparc64/multiboot.c125
-rw-r--r--qemu/roms/openbios/arch/sparc64/multiboot.h96
-rw-r--r--qemu/roms/openbios/arch/sparc64/ofmem_sparc64.c381
-rw-r--r--qemu/roms/openbios/arch/sparc64/openbios.c664
-rw-r--r--qemu/roms/openbios/arch/sparc64/openbios.h27
-rw-r--r--qemu/roms/openbios/arch/sparc64/openprom.h281
-rw-r--r--qemu/roms/openbios/arch/sparc64/plainboot.c21
-rw-r--r--qemu/roms/openbios/arch/sparc64/pstate.h90
-rw-r--r--qemu/roms/openbios/arch/sparc64/spitfire.h510
-rw-r--r--qemu/roms/openbios/arch/sparc64/switch.S124
-rw-r--r--qemu/roms/openbios/arch/sparc64/sys_info.c59
-rw-r--r--qemu/roms/openbios/arch/sparc64/tree.fs49
-rw-r--r--qemu/roms/openbios/arch/sparc64/vectors.S591
29 files changed, 0 insertions, 5504 deletions
diff --git a/qemu/roms/openbios/arch/sparc64/boot.c b/qemu/roms/openbios/arch/sparc64/boot.c
deleted file mode 100644
index 5107be6ca..000000000
--- a/qemu/roms/openbios/arch/sparc64/boot.c
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- *
- */
-#undef BOOTSTRAP
-#include "config.h"
-#include "libopenbios/bindings.h"
-#include "arch/common/nvram.h"
-#include "libc/diskio.h"
-#include "libc/vsprintf.h"
-#include "libopenbios/sys_info.h"
-#include "boot.h"
-
-uint64_t kernel_image;
-uint64_t kernel_size;
-uint64_t qemu_cmdline;
-uint64_t cmdline_size;
-char boot_device;
-
-extern int sparc64_of_client_interface( int *params );
-
-
-void go(void)
-{
- ucell address, type, size;
- int image_retval = 0;
-
- /* Get the entry point and the type (see forth/debugging/client.fs) */
- feval("saved-program-state >sps.entry @");
- address = POP();
- feval("saved-program-state >sps.file-type @");
- type = POP();
- feval("saved-program-state >sps.file-size @");
- size = POP();
-
- printk("\nJumping to entry point " FMT_ucellx " for type " FMT_ucellx "...\n", address, type);
-
- switch (type) {
- case 0x0:
- /* Start ELF boot image */
- image_retval = start_elf(address, (uint64_t)&elf_boot_notes);
- break;
-
- case 0x1:
- /* Start ELF image */
- image_retval = start_client_image(address, (uint64_t)&sparc64_of_client_interface);
- break;
-
- case 0x5:
- /* Start a.out image */
- image_retval = start_client_image(address, (uint64_t)&sparc64_of_client_interface);
- break;
-
- case 0x10:
- /* Start Fcode image */
- printk("Evaluating FCode...\n");
- PUSH(address);
- PUSH(1);
- fword("byte-load");
- image_retval = 0;
- break;
-
- case 0x11:
- /* Start Forth image */
- PUSH(address);
- PUSH(size);
- fword("eval2");
- image_retval = 0;
- break;
- }
-
- printk("Image returned with return value %#x\n", image_retval);
-}
-
-/* ( path len -- path len ) */
-
-void boot(void)
-{
- char *path, *param;
-
- /* Copy the incoming path */
- fword("2dup");
- path = pop_fstr_copy();
-
- /* Boot preloaded kernel */
- if (kernel_size) {
- void (*entry)(unsigned long p1, unsigned long p2, unsigned long p3,
- unsigned long p4, unsigned long p5);
-
- printk("[sparc64] Kernel already loaded\n");
- entry = (void *) (unsigned long)kernel_image;
- entry(0, 0, 0, 0, (unsigned long)&sparc64_of_client_interface);
- }
-
- /* Invoke Linux directly -- probably not supported */
- if(!path) {
- /* No path specified, so grab defaults from /chosen */
- push_str("bootpath");
- push_str("/chosen");
- fword("(find-dev)");
- POP();
- fword("get-package-property");
- POP();
- /* Update our local copy of path as well as the one on the stack */
- fword("2dup");
- path = pop_fstr_copy();
- }
-
- if (path) {
- param = strchr(path, ' ');
- if(param) {
- *param = '\0';
- param++;
- } else if (cmdline_size) {
- param = (char *)qemu_cmdline;
- } else {
- push_str("boot-args");
- push_str("/options");
- fword("(find-dev)");
- POP();
- fword("get-package-property");
- POP();
- param = pop_fstr_copy();
- }
-
- /* Invoke platform-specific Linux loader */
- linux_load(&sys_info, path, param);
-
- free(path);
- }
-}
diff --git a/qemu/roms/openbios/arch/sparc64/boot.h b/qemu/roms/openbios/arch/sparc64/boot.h
deleted file mode 100644
index 3ab05e0a3..000000000
--- a/qemu/roms/openbios/arch/sparc64/boot.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* tag: openbios loader prototypes for sparc64
- *
- * Copyright (C) 2004 Stefan Reinauer
- *
- * See the file "COPYING" for further information about
- * the copyright and warranty status of this work.
- */
-
-// linux_load.c
-int linux_load(struct sys_info *info, const char *file, const char *cmdline);
-
-// context.c
-extern struct context * volatile __context;
-uint64_t start_elf(uint64_t entry_point, uint64_t param);
-uint64_t start_client_image(uint64_t entry_point, uint64_t cif_handler);
-
-// boot.c
-extern uint64_t kernel_image;
-extern uint64_t kernel_size;
-extern uint64_t qemu_cmdline;
-extern uint64_t cmdline_size;
-extern char boot_device;
-extern void boot(void);
-extern void go(void);
-
-// sys_info.c
-extern uint64_t qemu_mem_size;
-extern void collect_sys_info(struct sys_info *info);
-
-// console.c
-void ob_su_init(uint64_t base, uint64_t offset, int intr);
-void cls(void);
-
-// lib.c
-void ob_mmu_init(const char *cpuname, uint64_t ram_size);
diff --git a/qemu/roms/openbios/arch/sparc64/build.xml b/qemu/roms/openbios/arch/sparc64/build.xml
deleted file mode 100644
index 3a1cd346a..000000000
--- a/qemu/roms/openbios/arch/sparc64/build.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<build condition="SPARC64">
-
- <dictionary name="openbios-sparc64" init="openbios">
- <object source="tree.fs" target="forth"/>
- <object source="init.fs" target="forth"/>
- <object source="QEMU,VGA.bin" target="fcode" condition="DRIVER_VGA"/>
- </dictionary>
-
- <library name="sparc64" type="static" target="target">
- <object source="openbios.c"/>
- <object source="console.c"/>
- <object source="lib.c"/>
- <object source="boot.c"/>
- <object source="context.c"/>
- <object source="switch.S"/>
- <object source="linux_load.c"/>
- <object source="sys_info.c"/>
- <object source="ofmem_sparc64.c"/>
- <object source="entry.S"/>
- <object source="vectors.S"/>
- <object source="call-client.S"/>
- </library>
-
- <executable name="openbios-plain.elf" target="target" condition="IMAGE_ELF">
- <rule>
- $(call quiet-command,$(LD) --warn-common -T $(SRCDIR)/arch/sparc64/ldscript -o $@.nostrip --whole-archive $^," LINK $(TARGET_DIR)$@")
- $(call quiet-command,$(NM) $@.nostrip | sort > $(ODIR)/openbios-plain.syms," GEN $(TARGET_DIR)$@.syms")
- $(call quiet-command,$(STRIP) $@.nostrip -o $@," STRIP $(TARGET_DIR)$@")</rule>
- <object source="plainboot.c"/>
- <external-object source="libsparc64.a"/>
- <external-object source="libbootstrap.a"/>
- <external-object source="libopenbios.a"/>
- <external-object source="libpackages.a"/>
- <external-object source="libdrivers.a"/>
- <external-object source="libfs.a"/>
- <external-object source="liblibc.a"/>
- <external-object source="libgcc.a"/>
- </executable>
-
- <!-- HACK ALERT -->
-
- <executable name="target/include/static-dict.h" target="target" condition="IMAGE_ELF_EMBEDDED">
- <rule><![CDATA[
- $(call quiet-command,$(ODIR)/forthstrap -x -D $@ -d $< </dev/null, " GEN $(TARGET_DIR)$@")]]></rule>
- <external-object source="openbios-sparc64.dict"/>
- </executable>
-
- <executable name="target/arch/sparc64/builtin.o" target="target" condition="IMAGE_ELF_EMBEDDED">
- <rule><![CDATA[ $(SRCDIR)/arch/sparc64/builtin.c $(ODIR)/target/include/static-dict.h
- $(call quiet-command,$(CC) $$EXTRACFLAGS $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/arch/sparc64/builtin.c, " CC $(TARGET_DIR)$@")]]></rule>
- </executable>
-
- <!-- END OF HACK ALERT -->
-
- <executable name="openbios-builtin.elf" target="target" condition="IMAGE_ELF_EMBEDDED">
- <!-- We use -N to reduce the file size by 1M -->
- <rule>
- $(call quiet-command,$(LD) --warn-common -N -T $(SRCDIR)/arch/sparc64/ldscript -o $@.nostrip --whole-archive $^," LINK $(TARGET_DIR)$@")
- $(call quiet-command,$(NM) $@.nostrip | sort > $(ODIR)/openbios-builtin.syms," GEN $(TARGET_DIR)$@.syms")
- $(call quiet-command,$(STRIP) $@.nostrip -o $@," STRIP $(TARGET_DIR)$@")</rule>
- <external-object source="target/arch/sparc64/builtin.o"/>
- <external-object source="libsparc64.a"/>
- <external-object source="libbootstrap.a"/>
- <external-object source="libopenbios.a"/>
- <external-object source="libpackages.a"/>
- <external-object source="libdrivers.a"/>
- <external-object source="libfs.a"/>
- <external-object source="liblibc.a"/>
- <external-object source="libgcc.a"/>
- </executable>
-
-</build>
diff --git a/qemu/roms/openbios/arch/sparc64/builtin.c b/qemu/roms/openbios/arch/sparc64/builtin.c
deleted file mode 100644
index 864da7971..000000000
--- a/qemu/roms/openbios/arch/sparc64/builtin.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* tag: openbios forth starter for builtin dictionary for sparc64
- *
- * Copyright (C) 2003 Stefan Reinauer
- *
- * See the file "COPYING" for further information about
- * the copyright and warranty status of this work.
- */
-
-#include "config.h"
-#include "asm/types.h"
-#include "libopenbios/sys_info.h"
-
-/*
- * wrap an array around the hex'ed dictionary file
- */
-
-/* 512K for the dictionary */
-#define DICTIONARY_SIZE (512 * 1024 / sizeof(ucell))
-#define DICTIONARY_BASE ((ucell)((char *)&forth_dictionary))
-
-static ucell forth_dictionary[DICTIONARY_SIZE] = {
-#include "static-dict.h"
-};
-
-void collect_multiboot_info(struct sys_info *info);
-void collect_multiboot_info(struct sys_info *info)
-{
- info->dict_start=(unsigned long *)forth_dictionary;
- info->dict_end = (unsigned long *)FORTH_DICTIONARY_END;
- info->dict_last = (ucell *)((unsigned char *)forth_dictionary +
- FORTH_DICTIONARY_LAST);
- info->dict_limit = sizeof(forth_dictionary);
-}
diff --git a/qemu/roms/openbios/arch/sparc64/call-client.S b/qemu/roms/openbios/arch/sparc64/call-client.S
deleted file mode 100644
index a8c0348e4..000000000
--- a/qemu/roms/openbios/arch/sparc64/call-client.S
+++ /dev/null
@@ -1,118 +0,0 @@
-#include "cpustate.h"
-
- .globl sparc64_of_client_interface, client_tba
-
-
-/*
- * SAVE_WINDOW_STATE and RESTORE_WINDOW_STATE are used to ensure
- * that the CPU window state is preserved across CIF calls. This is
- * to workaround a *BSD restriction that window fill/spill traps must
- * be minimised during trap table takeover, and likely emulates the
- * behaviour of OBP.
- */
-
- .data
- .align 8
-
-client_stack:
- .xword 0
-client_tba:
- .xword 0
-client_window:
- .skip 2048
-
-
- .text
- .align 4
- .register %g2, #scratch
- .register %g3, #scratch
- .register %g6, #scratch
- .register %g7, #scratch
-/*
- make some more space on stack since linux kernel only provides 128 bytes
- without memory to spill registers (used by gcc in -O0 mode)
-*/
-
-sparc64_of_client_interface:
-
- /* Save globals on callers stack */
- add %sp, -248, %sp
-
- stx %g1, [%sp + 2047 + 192]
- stx %g2, [%sp + 2047 + 200]
- stx %g3, [%sp + 2047 + 208]
- stx %g4, [%sp + 2047 + 216]
- stx %g5, [%sp + 2047 + 224]
- stx %g6, [%sp + 2047 + 232]
- stx %g7, [%sp + 2047 + 240]
-
- /* Save client trap table */
- setx client_tba, %g6, %g7
- rdpr %tba, %g6
- stx %g6, [%g7]
-
- /* Save existing stack */
- setx client_stack, %g6, %g7
- stx %sp, [%g7]
-
- /* Save windows */
- setx _fcstack_ptr, %g6, %g7
- ldx [%g7], %g1
- add %g1, -CONTEXT_STATE_SIZE, %g1
- stx %g1, [%g7]
-
- SAVE_CPU_WINDOW_STATE(cif)
-
- /* Move to OpenBIOS context stack */
- setx _fcstack_ptr, %g6, %g7
- ldx [%g7], %g6
- setx CONTEXT_STACK_SIZE, %g4, %g5
- sub %g6, %g5, %g6
- stx %g6, [%g7]
-
- setx - 2047 - 192, %g6, %g7
- add %g1, %g7, %g7
- mov %g7, %sp
-
- /* Call client inteface */
- call of_client_interface
- ldx [%g1 + 0x30], %o0
-
- /* Restore windows */
- setx _fcstack_ptr, %g6, %g7
- ldx [%g7], %g1
- setx CONTEXT_STACK_SIZE, %g4, %g5
- add %g1, %g5, %g1
- stx %g1, [%g7]
-
- /* Return value */
- stx %o0, [%g1 + 0x30]
-
- RESTORE_CPU_WINDOW_STATE(cif)
-
- add %g1, CONTEXT_STATE_SIZE, %g1
- setx _fcstack_ptr, %g6, %g7
- stx %g1, [%g7]
-
- /* Restore stack */
- setx client_stack, %g6, %g7
- ldx [%g7], %sp
-
- /* Restore client trap table */
- setx client_tba, %g6, %g7
- ldx [%g7], %g6
- wrpr %g6, %tba
-
- /* Restore globals */
- ldx [%sp + 2047 + 192], %g1
- ldx [%sp + 2047 + 200], %g2
- ldx [%sp + 2047 + 208], %g3
- ldx [%sp + 2047 + 216], %g4
- ldx [%sp + 2047 + 224], %g5
- ldx [%sp + 2047 + 232], %g6
- ldx [%sp + 2047 + 240], %g7
-
- add %sp, 248, %sp
-
- jmp %o7+8
- nop
diff --git a/qemu/roms/openbios/arch/sparc64/console.c b/qemu/roms/openbios/arch/sparc64/console.c
deleted file mode 100644
index 6ab5cba4d..000000000
--- a/qemu/roms/openbios/arch/sparc64/console.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2003, 2004 Stefan Reinauer
- *
- * See the file "COPYING" for further information about
- * the copyright and warranty status of this work.
- */
-
-#include "config.h"
-#include "libopenbios/bindings.h"
-#include "libopenbios/console.h"
-#include "kernel/kernel.h"
-#include "drivers/drivers.h"
-#include "libopenbios/fontdata.h"
-#include "openbios.h"
-#include "libc/vsprintf.h"
-#include "libopenbios/sys_info.h"
-#include "boot.h"
-
-/* ******************************************************************
- * simple polling video/keyboard console functions
- * ****************************************************************** */
-
-#ifdef CONFIG_DEBUG_CONSOLE
-/* ******************************************************************
- * common functions, implementing simple concurrent console
- * ****************************************************************** */
-
-static int arch_putchar(int c)
-{
-#ifdef CONFIG_DEBUG_CONSOLE_SERIAL
- uart_putchar(c);
-#endif
- return c;
-}
-
-static int arch_availchar(void)
-{
-#ifdef CONFIG_DEBUG_CONSOLE_SERIAL
- if (uart_charav(CONFIG_SERIAL_PORT))
- return 1;
-#endif
-#ifdef CONFIG_DEBUG_CONSOLE_VGA
- if (pc_kbd_dataready())
- return 1;
-#endif
- return 0;
-}
-
-static int arch_getchar(void)
-{
-#ifdef CONFIG_DEBUG_CONSOLE_SERIAL
- if (uart_charav(CONFIG_SERIAL_PORT))
- return (uart_getchar(CONFIG_SERIAL_PORT));
-#endif
-#ifdef CONFIG_DEBUG_CONSOLE_VGA
- if (pc_kbd_dataready())
- return (pc_kbd_readdata());
-#endif
- return 0;
-}
-
-struct _console_ops arch_console_ops = {
- .putchar = arch_putchar,
- .availchar = arch_availchar,
- .getchar = arch_getchar
-};
-
-#endif // CONFIG_DEBUG_CONSOLE
diff --git a/qemu/roms/openbios/arch/sparc64/const.h b/qemu/roms/openbios/arch/sparc64/const.h
deleted file mode 100644
index 8ad902b2c..000000000
--- a/qemu/roms/openbios/arch/sparc64/const.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/* const.h: Macros for dealing with constants. */
-
-#ifndef _SPARC64_CONST_H
-#define _SPARC64_CONST_H
-
-/* Some constant macros are used in both assembler and
- * C code. Therefore we cannot annotate them always with
- * 'UL' and other type specificers unilaterally. We
- * use the following macros to deal with this.
- */
-
-#ifdef __ASSEMBLY__
-#define _AC(X,Y) X
-#else
-#define _AC(X,Y) (X##Y)
-#endif
-
-
-#endif /* !(_SPARC64_CONST_H) */
diff --git a/qemu/roms/openbios/arch/sparc64/context.c b/qemu/roms/openbios/arch/sparc64/context.c
deleted file mode 100644
index 98932ee9c..000000000
--- a/qemu/roms/openbios/arch/sparc64/context.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * context switching
- * 2003-10 by SONE Takeshi
- */
-
-#include "config.h"
-#include "kernel/kernel.h"
-#include "context.h"
-#include "libopenbios/sys_info.h"
-#include "boot.h"
-#include "openbios.h"
-
-#define MAIN_STACK_SIZE 16384
-#define IMAGE_STACK_SIZE 4096*4
-
-#define debug printk
-
-static void start_main(void); /* forward decl. */
-void __exit_context(void); /* assembly routine */
-
-/*
- * Main context structure
- * It is placed at the bottom of our stack, and loaded by assembly routine
- * to start us up.
- */
-static struct context main_ctx = {
- .regs[REG_SP] = (uint64_t) &_estack - STACK_BIAS - 96,
- .pc = (uint64_t) start_main,
- .npc = (uint64_t) start_main + 4,
- .return_addr = (uint64_t) __exit_context,
-};
-
-/* This is used by assembly routine to load/store the context which
- * it is to switch/switched. */
-struct context * volatile __context = &main_ctx;
-
-/* Stack for loaded ELF image */
-static uint8_t image_stack[IMAGE_STACK_SIZE];
-
-/* Pointer to startup context (physical address) */
-unsigned long __boot_ctx;
-
-/* Pointer to Forth context stack */
-void *_fcstack_ptr = &_efcstack;
-
-
-/*
- * Main starter
- * This is the C function that runs first.
- */
-static void start_main(void)
-{
- /* Save startup context, so we can refer to it later.
- * We have to keep it in physical address since we will relocate. */
- __boot_ctx = virt_to_phys(__context);
-
- /* Start the real fun */
- openbios();
-
- /* Returning from here should jump to __exit_context */
- __context = boot_ctx;
-}
-
-static uint64_t ALIGN_SIZE(uint64_t x, uint64_t a)
-{
- return (x + a - 1) & ~(a-1);
-}
-
-/* Setup a new context using the given stack.
- */
-struct context *
-init_context(uint8_t *stack, uint64_t stack_size, int num_params)
-{
- struct context *ctx;
- uint8_t *stack_top = stack + stack_size;
-
- ctx = (struct context *)
- (stack_top - ALIGN_SIZE(sizeof(*ctx) + num_params*sizeof(uint64_t), sizeof(uint64_t)));
- memset(ctx, 0, sizeof(*ctx));
-
- /* Fill in reasonable default for flat memory model */
- ctx->regs[REG_SP] = virt_to_phys(stack_top - STACK_BIAS - 192);
- ctx->return_addr = virt_to_phys(__exit_context);
-
- return ctx;
-}
-
-/* Switch to another context. */
-struct context *switch_to(struct context *ctx)
-{
- struct context *save, *ret;
-
- debug("switching to new context: entry point %#llx stack 0x%016llx\n", ctx->pc, ctx->regs[REG_SP]);
- save = __context;
- __context = ctx;
- //asm ("pushl %cs; call __switch_context");
- asm ("call __switch_context_nosave; nop");
- ret = __context;
- __context = save;
- return ret;
-}
-
-/* Start ELF Boot image */
-uint64_t start_elf(uint64_t entry_point, uint64_t param)
-{
- struct context *ctx;
-
- ctx = init_context(image_stack, sizeof image_stack, 1);
- ctx->pc = entry_point;
- ctx->param[0] = param;
- //ctx->eax = 0xe1fb007;
- //ctx->ebx = param;
-
- ctx = switch_to(ctx);
- //return ctx->eax;
- return 0;
-}
-
-/* Start client image */
-uint64_t start_client_image(uint64_t entry_point, uint64_t cif_handler)
-{
- struct context *ctx;
-
- ctx = init_context(image_stack, sizeof image_stack, 0);
- ctx->pc = entry_point;
- ctx->npc = entry_point+4;
- ctx->regs[REG_O0] = 0;
- ctx->regs[REG_O0+4] = cif_handler;
-
- ctx = switch_to(ctx);
-
- return 0;
-}
diff --git a/qemu/roms/openbios/arch/sparc64/context.h b/qemu/roms/openbios/arch/sparc64/context.h
deleted file mode 100644
index 2756fa15f..000000000
--- a/qemu/roms/openbios/arch/sparc64/context.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef SPARC64_CONTEXT_H
-#define SPARC64_CONTEXT_H
-
-#define STACK_BIAS 2047
-
-struct context {
- /* General registers */
- uint64_t regs[32];
- uint64_t pc;
- uint64_t npc;
-#define REG_O0 8
-#define REG_SP 14
-#define SP_LOC(ctx) (&(ctx)->regs[REG_SP])
- /* Flags */
- /* Optional stack contents */
- uint64_t return_addr;
- uint64_t param[0];
-};
-
-/* Create a new context in the given stack */
-struct context *
-init_context(uint8_t *stack, uint64_t stack_size, int num_param);
-
-/* Switch context */
-struct context *switch_to(struct context *);
-
-/* Holds physical address of boot context */
-extern unsigned long __boot_ctx;
-
-/* This can always be safely used to refer to the boot context */
-#define boot_ctx ((struct context *) phys_to_virt(__boot_ctx))
-
-#endif /* SPARC64_CONTEXT_H */
diff --git a/qemu/roms/openbios/arch/sparc64/cpustate.h b/qemu/roms/openbios/arch/sparc64/cpustate.h
deleted file mode 100644
index 0c276bfd1..000000000
--- a/qemu/roms/openbios/arch/sparc64/cpustate.h
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Save/restore CPU state macros
- *
- * Copyright (C) 2015 Mark Cave-Ayland (mark.cave-ayland@ilande.co.uk>)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2
- *
- */
-
-/* State size for context (see below) */
-#define CONTEXT_STATE_SIZE 0x510
-
-/* Stack size for context (allocated inline of the context stack) */
-#define CONTEXT_STACK_SIZE 0x2000
-
-/*
- * SAVE_CPU_STATE and RESTORE_CPU_STATE are macros used to enable a context switch
- * to C to occur within the MMU I/D TLB miss handlers.
- *
- * Because these handlers are called on a TLB miss, we cannot use flushw to store
- * processor window state on the stack, as the memory areas used by each window's
- * stack pointer may not be in the TLB, causing recursive TLB miss traps.
- *
- * For this reason, we save window state by manually rotating the window registers
- * and saving their contents (along with other vital registers) into a special
- * tlb_handler_stack defined above which is guaranteed to be locked in the TLB, and
- * so won't cause issues with trap recursion.
- *
- * Once this process is complete, we remain in a TL=0, CWP=0 state (with IE=1 to allow
- * window fill/spill traps if required), switch to our safe tlb_handler_stack and
- * invoke the miss handler.
- */
-
-#define SAVE_CPU_WINDOW_STATE(type) \
- /* Save window state into context at %g1 */ \
- rdpr %cwp, %g7; \
- stx %g7, [%g1]; \
- rdpr %cansave, %g7; \
- stx %g7, [%g1 + 0x8]; \
- rdpr %canrestore, %g7; \
- stx %g7, [%g1 + 0x10]; \
- rdpr %otherwin, %g7; \
- stx %g7, [%g1 + 0x18]; \
- rdpr %wstate, %g7; \
- stx %g7, [%g1 + 0x20]; \
- rdpr %cleanwin, %g7; \
- stx %g7, [%g1 + 0x28]; \
- \
- stx %o0, [%g1 + 0x30]; \
- stx %o1, [%g1 + 0x38]; \
- stx %o2, [%g1 + 0x40]; \
- stx %o3, [%g1 + 0x48]; \
- stx %o4, [%g1 + 0x50]; \
- stx %o5, [%g1 + 0x58]; \
- stx %o6, [%g1 + 0x60]; \
- stx %o7, [%g1 + 0x68]; \
- \
- rdpr %pstate, %g7; \
- stx %g7, [%g1 + 0x70]; \
- rd %y, %g7; \
- stx %g7, [%g1 + 0x78]; \
- rd %fprs, %g7; \
- stx %g7, [%g1 + 0x80]; \
- rdpr %tl, %g7; \
- stx %g7, [%g1 + 0x88]; \
- \
- /* Now iterate through all of the windows saving all l and i registers */ \
- add %g1, 0x90, %g5; \
- \
- /* Get the number of windows in %g6 */ \
- rdpr %ver, %g6; \
- and %g6, 0xf, %g6; \
- \
- mov %g6, %g4; \
- inc %g4; \
- \
- /* Starting cwp in g7 */ \
- rdpr %cwp, %g7; \
- \
-save_cpu_window_##type: \
- wrpr %g7, %cwp; \
- stx %l0, [%g5]; \
- stx %l1, [%g5 + 0x8]; \
- stx %l2, [%g5 + 0x10]; \
- stx %l3, [%g5 + 0x18]; \
- stx %l4, [%g5 + 0x20]; \
- stx %l5, [%g5 + 0x28]; \
- stx %l6, [%g5 + 0x30]; \
- stx %l7, [%g5 + 0x38]; \
- stx %i0, [%g5 + 0x40]; \
- stx %i1, [%g5 + 0x48]; \
- stx %i2, [%g5 + 0x50]; \
- stx %i3, [%g5 + 0x58]; \
- stx %i4, [%g5 + 0x60]; \
- stx %i5, [%g5 + 0x68]; \
- stx %i6, [%g5 + 0x70]; \
- stx %i7, [%g5 + 0x78]; \
- dec %g7; \
- and %g7, %g6, %g7; \
- subcc %g4, 1, %g4; \
- bne save_cpu_window_##type; \
- add %g5, 0x80, %g5; \
- \
- /* For 8 windows with 16 registers to save in the window, memory required \
- is 16*8*8 = 0x400 bytes */ \
- \
- /* Now we should be in window 0 so update the other window registers */ \
- rdpr %ver, %g6; \
- and %g6, 0xf, %g6; \
- dec %g6; \
- wrpr %g6, %cansave; \
- \
- wrpr %g0, %cleanwin; \
- wrpr %g0, %canrestore; \
- wrpr %g0, %otherwin; \
-
-
-#define SAVE_CPU_TRAP_STATE(type) \
- /* Save trap state into context at %g1 */ \
- add %g1, 0x490, %g5; \
- mov 4, %g6; \
- \
-save_trap_state_##type: \
- deccc %g6; \
- wrpr %g6, %tl; \
- rdpr %tpc, %g7; \
- stx %g7, [%g5]; \
- rdpr %tnpc, %g7; \
- stx %g7, [%g5 + 0x8]; \
- rdpr %tstate, %g7; \
- stx %g7, [%g5 + 0x10]; \
- rdpr %tt, %g7; \
- stx %g7, [%g5 + 0x18]; \
- bne save_trap_state_##type; \
- add %g5, 0x20, %g5; \
- \
- /* For 4 trap levels with 4 registers, memory required is \
- 4*8*4 = 0x80 bytes */
-
-/* Save all state into context at %g1 */
-#define SAVE_CPU_STATE(type) \
- SAVE_CPU_WINDOW_STATE(type); \
- SAVE_CPU_TRAP_STATE(type);
-
-
-#define RESTORE_CPU_WINDOW_STATE(type) \
- /* Restore window state from context at %g1 */ \
- \
- /* Get the number of windows in %g6 */ \
- rdpr %ver, %g6; \
- and %g6, 0xf, %g6; \
- \
- mov %g6, %g4; \
- inc %g4; \
- \
- /* Set starting window */ \
- ldx [%g1], %g7; \
- \
- /* Now iterate through all of the windows restoring all l and i registers */ \
- add %g1, 0x90, %g5; \
- \
-restore_cpu_window_##type: \
- wrpr %g7, %cwp; \
- ldx [%g5], %l0; \
- ldx [%g5 + 0x8], %l1; \
- ldx [%g5 + 0x10], %l2; \
- ldx [%g5 + 0x18], %l3; \
- ldx [%g5 + 0x20], %l4; \
- ldx [%g5 + 0x28], %l5; \
- ldx [%g5 + 0x30], %l6; \
- ldx [%g5 + 0x38], %l7; \
- ldx [%g5 + 0x40], %i0; \
- ldx [%g5 + 0x48], %i1; \
- ldx [%g5 + 0x50], %i2; \
- ldx [%g5 + 0x58], %i3; \
- ldx [%g5 + 0x60], %i4; \
- ldx [%g5 + 0x68], %i5; \
- ldx [%g5 + 0x70], %i6; \
- ldx [%g5 + 0x78], %i7; \
- dec %g7; \
- and %g7, %g6, %g7; \
- subcc %g4, 1, %g4; \
- bne restore_cpu_window_##type; \
- add %g5, 0x80, %g5; \
- \
- /* Restore the window registers to their original value */ \
- ldx [%g1], %g7; \
- wrpr %g7, %cwp; \
- ldx [%g1 + 0x8], %g7; \
- wrpr %g7, %cansave; \
- ldx [%g1 + 0x10], %g7; \
- wrpr %g7, %canrestore; \
- ldx [%g1 + 0x18], %g7; \
- wrpr %g7, %otherwin; \
- ldx [%g1 + 0x20], %g7; \
- wrpr %g7, %wstate; \
- ldx [%g1 + 0x28], %g7; \
- wrpr %g7, %cleanwin; \
- \
- ldx [%g1 + 0x30], %o0; \
- ldx [%g1 + 0x38], %o1; \
- ldx [%g1 + 0x40], %o2; \
- ldx [%g1 + 0x48], %o3; \
- ldx [%g1 + 0x50], %o4; \
- ldx [%g1 + 0x58], %o5; \
- ldx [%g1 + 0x60], %o6; \
- ldx [%g1 + 0x68], %o7; \
- \
- ldx [%g1 + 0x70], %g7; \
- wrpr %g7, %pstate; \
- ldx [%g1 + 0x78], %g7; \
- wr %g7, 0, %y; \
- ldx [%g1 + 0x80], %g7; \
- wr %g7, 0, %fprs; \
-
-
-#define RESTORE_CPU_TRAP_STATE(type) \
- /* Restore trap state from context at %g1 */ \
- add %g1, 0x490, %g5; \
- mov 4, %g6; \
- \
-restore_trap_state_##type: \
- deccc %g6; \
- wrpr %g6, %tl; \
- ldx [%g5], %g7; \
- wrpr %g7, %tpc; \
- ldx [%g5 + 0x8], %g7; \
- wrpr %g7, %tnpc; \
- ldx [%g5 + 0x10], %g7; \
- wrpr %g7, %tstate; \
- ldx [%g5 + 0x18], %g7; \
- wrpr %g7, %tt; \
- bne restore_trap_state_##type; \
- add %g5, 0x20, %g5; \
- \
- ldx [%g1 + 0x88], %g7; \
- wrpr %g7, %tl
-
-/* Restore all state from context at %g1 */
-#define RESTORE_CPU_STATE(type) \
- RESTORE_CPU_WINDOW_STATE(type); \
- RESTORE_CPU_TRAP_STATE(type);
diff --git a/qemu/roms/openbios/arch/sparc64/entry.S b/qemu/roms/openbios/arch/sparc64/entry.S
deleted file mode 100644
index d03128af5..000000000
--- a/qemu/roms/openbios/arch/sparc64/entry.S
+++ /dev/null
@@ -1,287 +0,0 @@
-/**
- ** Standalone startup code for Linux PROM emulator.
- ** Copyright 1999 Pete A. Zaitcev
- ** This code is licensed under GNU General Public License.
- **/
-/*
- * $Id: head.S,v 1.12 2002/07/23 05:47:09 zaitcev Exp $
- */
-
-#define __ASSEMBLY__
-#include <asm/asi.h>
-#include "pstate.h"
-#include "lsu.h"
-#define NO_QEMU_PROTOS
-#define NO_OPENBIOS_PROTOS
-#include "arch/common/fw_cfg.h"
-
-#define PROM_ADDR 0x1fff0000000
-#define CFG_ADDR 0x1fe02000510
-#define HZ 1 * 1000 * 1000
-#define TICK_INT_DIS 0x8000000000000000
-
- .globl entry, _entry
-
- .section ".text", "ax"
- .align 8
- .register %g2, #scratch
- .register %g3, #scratch
- .register %g6, #scratch
- .register %g7, #scratch
-
-/*
- * Entry point
- * We start execution from here.
- */
-_entry:
-entry:
- ! Set up CPU state
- wrpr %g0, PSTATE_PRIV, %pstate
- wr %g0, 0, %fprs
- wrpr %g0, 0x0, %tl
-
- ! Extract NWINDOWS from %ver
- rdpr %ver, %g1
- and %g1, 0xf, %g1
- dec %g1
- wrpr %g1, 0, %cleanwin
- wrpr %g1, 0, %cansave
- wrpr %g0, 0, %canrestore
- wrpr %g0, 0, %otherwin
- wrpr %g0, 0, %wstate
- ! disable timer now
- setx TICK_INT_DIS, %g2, %g1
- wr %g1, 0, %tick_cmpr
-
- ! Disable I/D MMUs and caches
- stxa %g0, [%g0] ASI_LSU_CONTROL
-
- ! Check signature "QEMU"
- setx CFG_ADDR, %g2, %g5
- mov FW_CFG_SIGNATURE, %g2
- stha %g2, [%g5] ASI_PHYS_BYPASS_EC_E_L
- inc %g5
- lduba [%g5] ASI_PHYS_BYPASS_EC_E, %g2
- cmp %g2, 'Q'
- bne bad_conf
- nop
- lduba [%g5] ASI_PHYS_BYPASS_EC_E, %g2
- cmp %g2, 'E'
- bne bad_conf
- nop
- lduba [%g5] ASI_PHYS_BYPASS_EC_E, %g2
- cmp %g2, 'M'
- bne bad_conf
- nop
- lduba [%g5] ASI_PHYS_BYPASS_EC_E, %g2
- cmp %g2, 'U'
- bne bad_conf
- nop
-
- ! Clear ITLB
- mov 6 << 3, %g1
- stxa %g0, [%g1] ASI_IMMU
- stxa %g0, [%g1] ASI_DMMU
- mov 63 << 3, %g1
-1: stxa %g0, [%g1] ASI_ITLB_DATA_ACCESS
- subcc %g1, 1 << 3, %g1
- bpos 1b
- nop
-
- ! Clear DTLB
- mov 63 << 3, %g1
-1: stxa %g0, [%g1] ASI_DTLB_DATA_ACCESS
- subcc %g1, 1 << 3, %g1
- bpos 1b
- nop
-
- ! Get memory size from configuration device
- ! NB: little endian format
- mov FW_CFG_RAM_SIZE, %g2
- dec %g5
- stha %g2, [%g5] ASI_PHYS_BYPASS_EC_E_L
- inc %g5
- lduba [%g5] ASI_PHYS_BYPASS_EC_E, %g4
-
- lduba [%g5] ASI_PHYS_BYPASS_EC_E, %g3
- sllx %g3, 8, %g3
- or %g3, %g4, %g4
-
- lduba [%g5] ASI_PHYS_BYPASS_EC_E, %g3
- sllx %g3, 16, %g3
- or %g3, %g4, %g4
-
- lduba [%g5] ASI_PHYS_BYPASS_EC_E, %g3
- sllx %g3, 24, %g3
- or %g3, %g4, %g4
-
- lduba [%g5] ASI_PHYS_BYPASS_EC_E, %g3
- sllx %g3, 32, %g3
- or %g3, %g4, %g4
-
- lduba [%g5] ASI_PHYS_BYPASS_EC_E, %g3
- sllx %g3, 40, %g3
- or %g3, %g4, %g4
-
- lduba [%g5] ASI_PHYS_BYPASS_EC_E, %g3
- sllx %g3, 48, %g3
- or %g3, %g4, %g4
-
- lduba [%g5] ASI_PHYS_BYPASS_EC_E, %g3
- sllx %g3, 56, %g3
- or %g3, %g4, %g1
- ! %g1 contains end of memory
-
- setx _end, %g7, %g3
- set 0x7ffff, %g2
- add %g3, %g2, %g3
- andn %g3, %g2, %g3
- setx _data, %g7, %g2
- sub %g3, %g2, %g2
- sub %g1, %g2, %g2 ! %g2 = start of private memory
- mov %g2, %l0
-
- ! setup .data & .bss
- setx _data, %g7, %g4
- sub %g3, %g4, %g5
- srlx %g5, 19, %g6 ! %g6 = # of 512k .bss pages
- set 0xc0000000, %g3
- sllx %g3, 32, %g3
- or %g3, 0x76, %g3
- ! valid, 512k, locked, cacheable(I/E/C), priv, writable
- set 48, %g7
-1: stxa %g4, [%g7] ASI_DMMU ! vaddr = _data + N * 0x80000, ctx=0
- or %g2, %g3, %g5
- ! paddr = start_mem + N * 0x80000
- stxa %g5, [%g0] ASI_DTLB_DATA_IN
- set 0x80000, %g5
- add %g2, %g5, %g2
- add %g4, %g5, %g4
- deccc %g6
- bne 1b
- nop
-
- ! setup .rodata, also make .text readable
- setx _data, %g7, %g5
- setx _start, %g7, %g4
- sub %g5, %g4, %g5
- srlx %g5, 19, %g6 ! %g6 = # of 512k .rodata pages
- set 48, %g7
- set 0x80000, %g5
- setx PROM_ADDR, %l1, %l2
-1: stxa %g4, [%g7] ASI_DMMU ! vaddr = _rodata, ctx=0
- set 0xc0000000, %g3
- sllx %g3, 32, %g3
- or %g3, 0x74, %g3
- or %l2, %g3, %g3
- ! valid, 512k, locked, cacheable(I/E/C), priv
- ! paddr = _rodata + N * 0x10000
- stxa %g3, [%g0] ASI_DTLB_DATA_IN
- add %g4, %g5, %g4
- deccc %g6
- bne 1b
- add %l2, %g5, %l2
-
- membar #Sync
-
- setx _start, %g7, %g4
- setx _rodata, %g7, %g5
- sub %g5, %g4, %g5
- set 0x7ffff, %g7
- add %g5, %g7, %g5 ! round to 512k
- srlx %g5, 19, %g6 ! %g6 = # of 512k .text pages
- set 0x80000, %g5
- set 48, %g7
- setx PROM_ADDR, %l1, %l2
-1: stxa %g4, [%g7] ASI_IMMU ! vaddr = _start, ctx=0
- set 0xc0000000, %g3
- sllx %g3, 32, %g3
- or %g3, 0x74, %g3
- or %l2, %g3, %g3
- ! valid, 512k, locked, cacheable(I/E/C), priv
- ! paddr = _start + N * 0x80000
- stxa %g3, [%g0] ASI_ITLB_DATA_IN
- add %g4, %g5, %g4
- deccc %g6
- bne 1b
- add %l2, %g5, %l2
-
- flush %g4
-
- mov %g1, %g3
-
- set 8, %g2
- sta %g0, [%g2] ASI_DMMU ! set primary ctx=0
-
- ! Enable I/D MMUs and caches
- setx lowmem, %g2, %g1
- set LSU_CONTROL_DM|LSU_CONTROL_IM|LSU_CONTROL_DC|LSU_CONTROL_IC, %g2
- jmp %g1
- stxa %g2, [%g0] ASI_LSU_CONTROL
-
-lowmem:
- /* Copy the DATA section from ROM. */
- setx _data - 8, %o7, %o0 ! First address of DATA
- setx _bss, %o7, %o1 ! Last address of DATA
- setx _start, %o7, %o2
- sub %o0, %o2, %o2 ! _data - _start
- setx PROM_ADDR, %o7, %o3
- add %o3, %o2, %o2 ! PROM_ADDR + (_data - _start)
- ba 2f
- nop
-1:
- ldxa [%o2] ASI_PHYS_BYPASS_EC_E, %g1
- stx %g1, [%o0]
-2:
- add %o2, 0x8, %o2
- subcc %o0, %o1, %g0
- bl 1b
- add %o0, 0x8, %o0
-
- /* Zero out our BSS section. */
- setx _bss - 8, %o7, %o0 ! First address of BSS
- setx _end - 8, %o7, %o1 ! Last address of BSS
- ba 2f
- nop
-1:
- stx %g0, [%o0]
-2:
- subcc %o0, %o1, %g0
- bl 1b
- add %o0, 0x8, %o0
-
- setx trap_table, %g2, %g1
- wrpr %g1, %tba
-
- setx qemu_mem_size, %g7, %g1
- stx %g3, [%g1]
-
- setx _data, %g7, %g1 ! Store va->pa conversion factor
- sub %g1, %l0, %g2
- setx va_shift, %g7, %g1
- stx %g2, [%g1]
-
- /* Finally, turn on traps so that we can call c-code. */
- wrpr %g0, (PSTATE_PRIV|PSTATE_PEF|PSTATE_IE), %pstate
-
- ! 100 Hz timer
- setx TICK_INT_DIS, %g2, %g1
- rd %tick, %g2
- andn %g2, %g1, %g2
- set HZ, %g1
- add %g1, %g2, %g1
- wr %g1, 0, %tick_cmpr
-
- /* Switch to our main context.
- * Main context is statically defined in C.
- */
-
- call __switch_context_nosave
- nop
-
- /* We get here when the main context switches back to
- * the boot context.
- */
-bad_conf:
- b bad_conf
- nop
diff --git a/qemu/roms/openbios/arch/sparc64/init.fs b/qemu/roms/openbios/arch/sparc64/init.fs
deleted file mode 100644
index eb6c9da52..000000000
--- a/qemu/roms/openbios/arch/sparc64/init.fs
+++ /dev/null
@@ -1,61 +0,0 @@
-\ va>tte-data defer MMU virtual to physical address hook for Solaris
-\ We need to make sure this is in the global wordlist
-active-package 0 active-package!
-defer va>tte-data
-0 to va>tte-data
-active-package!
-
-:noname
- ." Type 'help' for detailed information" cr
- \ ." boot secondary slave cdrom: " cr
- \ ." 0 > boot hd:2,\boot\vmlinuz root=/dev/hda2" cr
- ; DIAG-initializer
-
-: make-openable ( path )
- find-dev if
- begin ?dup while
- \ install trivial open and close methods
- dup active-package! is-open
- parent
- repeat
- then
-;
-
-: preopen ( chosen-str node-path )
- 2dup make-openable
-
- " /chosen" find-device
- open-dev ?dup if
- encode-int 2swap property
- else
- 2drop
- then
-;
-
-:noname
- set-defaults
-; PREPOST-initializer
-
-\ preopen device nodes (and store the ihandles under /chosen)
-:noname
- " memory" " /memory" preopen
-
-; SYSTEM-initializer
-
-\ use the tty interface if available
-: activate-tty-interface
- " /packages/terminal-emulator" find-dev if drop
- then
-;
-
-device-end
-
-: rmap@ ( virt -- rmentry )
- drop 0
- ;
-
-\ Load VGA FCode driver blob
-[IFDEF] CONFIG_DRIVER_VGA
- -1 value vga-driver-fcode
- " QEMU,VGA.bin" $encode-file to vga-driver-fcode
-[THEN]
diff --git a/qemu/roms/openbios/arch/sparc64/ldscript b/qemu/roms/openbios/arch/sparc64/ldscript
deleted file mode 100644
index c5cc6a5ce..000000000
--- a/qemu/roms/openbios/arch/sparc64/ldscript
+++ /dev/null
@@ -1,72 +0,0 @@
-OUTPUT_FORMAT(elf64-sparc)
-OUTPUT_ARCH(sparc:v9)
-
-/* QEMU ELF loader can't handle very complex files, so we put ELFBoot
-info to rodata and put initctx to data.*/
-
-ENTRY(trap_table)
-
-/* Initial load address
- */
-BASE_ADDR = 0x00000000ffd00000;
-
-/* 16KB stack */
-STACK_SIZE = 16384;
-IOMEM_SIZE = 256 * 1024 + 768 * 1024;
-
-SECTIONS
-{
- . = BASE_ADDR;
-
- /* Start of the program.
- * Now the version string is in the note, we must include it
- * in the program. Otherwise we lose the string after relocation. */
- _start = .;
-
- /* Normal sections */
- .text ALIGN(524288): {
- *(.text.vectors)
- *(.text)
- *(.text.*)
- }
- .rodata ALIGN(524288): {
- _rodata = .;
- sound_drivers_start = .;
- *(.rodata.sound_drivers)
- sound_drivers_end = .;
- *(.rodata)
- *(.rodata.*)
- *(.note.ELFBoot)
- }
- .data ALIGN(524288): {
- _data = .;
- *(.data)
- *(.data.*)
- }
-
- .bss ALIGN(4096): {
- _bss = .;
- *(.bss)
- *(.bss.*)
- *(COMMON)
-
- _fcstack = .;
- . += 32768;
- . = ALIGN(16);
- _efcstack = .;
-
- _stack = .;
- . += STACK_SIZE;
- . = ALIGN(16);
- _estack = .;
- }
-
- . = ALIGN(4096);
- _end = .;
- _iomem = _end + IOMEM_SIZE;
-
- /* We discard .note sections other than .note.ELFBoot,
- * because some versions of GCC generates useless ones. */
-
- /DISCARD/ : { *(.comment*) *(.note.*) }
-}
diff --git a/qemu/roms/openbios/arch/sparc64/lib.c b/qemu/roms/openbios/arch/sparc64/lib.c
deleted file mode 100644
index 4709ca8fe..000000000
--- a/qemu/roms/openbios/arch/sparc64/lib.c
+++ /dev/null
@@ -1,508 +0,0 @@
-/* lib.c
- * tag: simple function library
- *
- * Copyright (C) 2003 Stefan Reinauer
- *
- * See the file "COPYING" for further information about
- * the copyright and warranty status of this work.
- */
-
-#include "config.h"
-#include "libc/vsprintf.h"
-#include "libopenbios/bindings.h"
-#include "spitfire.h"
-#include "libopenbios/sys_info.h"
-#include "boot.h"
-
-#include "arch/sparc64/ofmem_sparc64.h"
-
-/* Format a string and print it on the screen, just like the libc
- * function printf.
- */
-int printk( const char *fmt, ... )
-{
- char *p, buf[512];
- va_list args;
- int i;
-
- va_start(args, fmt);
- i = vsnprintf(buf, sizeof(buf), fmt, args);
- va_end(args);
-
- for( p=buf; *p; p++ )
- putchar(*p);
- return i;
-}
-
-/* Private functions for mapping between physical/virtual addresses */
-phys_addr_t
-va2pa(unsigned long va)
-{
- if ((va >= (unsigned long)&_start) &&
- (va < (unsigned long)&_end))
- return va - va_shift;
- else
- return va;
-}
-
-unsigned long
-pa2va(phys_addr_t pa)
-{
- if ((pa + va_shift >= (unsigned long)&_start) &&
- (pa + va_shift < (unsigned long)&_end))
- return pa + va_shift;
- else
- return pa;
-}
-
-void *malloc(int size)
-{
- return ofmem_malloc(size);
-}
-
-void* realloc( void *ptr, size_t size )
-{
- return ofmem_realloc(ptr, size);
-}
-
-void free(void *ptr)
-{
- ofmem_free(ptr);
-}
-
-static void
-mmu_open(void)
-{
- RET(-1);
-}
-
-static void
-mmu_close(void)
-{
-}
-
-void ofmem_walk_boot_map(translation_entry_cb cb)
-{
- unsigned long phys, virt, size, mode, data, mask;
- unsigned int i;
-
- for (i = 0; i < 64; i++) {
- data = spitfire_get_dtlb_data(i);
- if (data & SPITFIRE_TTE_VALID) {
- switch ((data >> 61) & 3) {
- default:
- case 0x0: /* 8k */
- mask = 0xffffffffffffe000ULL;
- size = PAGE_SIZE_8K;
- break;
- case 0x1: /* 64k */
- mask = 0xffffffffffff0000ULL;
- size = PAGE_SIZE_64K;
- break;
- case 0x2: /* 512k */
- mask = 0xfffffffffff80000ULL;
- size = PAGE_SIZE_512K;
- break;
- case 0x3: /* 4M */
- mask = 0xffffffffffc00000ULL;
- size = PAGE_SIZE_4M;
- break;
- }
-
- virt = spitfire_get_dtlb_tag(i);
- virt &= mask;
-
- /* extract 41bit physical address */
- phys = data & 0x000001fffffff000ULL;
- phys &= mask;
-
- mode = data & 0xfff;
-
- cb(phys, virt, size, mode);
- }
- }
-}
-
-/*
- 3.6.5 translate
- ( virt -- false | phys.lo ... phys.hi mode true )
-*/
-static void
-mmu_translate(void)
-{
- ucell virt, mode;
- phys_addr_t phys;
-
- virt = POP();
-
- phys = ofmem_translate(virt, &mode);
-
- if (phys != -1UL) {
- PUSH(phys & 0xffffffff);
- PUSH(phys >> 32);
- PUSH(mode);
- PUSH(-1);
- }
- else {
- PUSH(0);
- }
-}
-
-/*
- * D5.3 pgmap@ ( va -- tte )
- */
-static void
-pgmap_fetch(void)
-{
- unsigned long va, tte_data;
-
- va = POP();
-
- tte_data = find_tte(va);
- if (tte_data == -1)
- goto error;
-
- /* return tte_data */
- PUSH(tte_data);
- return;
-
-error:
- /* If we get here, there was no entry */
- PUSH(0);
-}
-
-/*
- ( index tte_data vaddr -- ? )
-*/
-static void
-dtlb_load(void)
-{
- unsigned long vaddr, tte_data, idx;
-
- vaddr = POP();
- tte_data = POP();
- idx = POP();
- dtlb_load3(vaddr, tte_data, idx);
-}
-
-/* MMU D-TLB miss handler */
-void
-dtlb_miss_handler(void)
-{
- unsigned long faultva, tte_data = 0;
-
- /* Grab fault address from MMU and round to nearest 8k page */
- faultva = dtlb_faultva();
- faultva >>= 13;
- faultva <<= 13;
-
- /* If a valid va>tte-data routine has been set, invoke that Forth xt instead */
- if (va2ttedata && *va2ttedata != 0) {
-
- /* va>tte-data ( addr cnum -- false | tte-data true ) */
- PUSH(faultva);
- PUSH(0);
- enterforth(*va2ttedata);
-
- /* Check the result first... */
- tte_data = POP();
- if (!tte_data) {
- bug();
- } else {
- /* Grab the real data */
- tte_data = POP();
- }
- } else {
- /* Search the ofmem linked list for this virtual address */
- tte_data = find_tte(faultva);
- }
-
- if (tte_data) {
- /* Update MMU */
- dtlb_load2(faultva, tte_data);
- } else {
- /* If we got here, there was no translation so fail */
- bug();
- }
-
-}
-
-/*
- ( index tte_data vaddr -- ? )
-*/
-static void
-itlb_load(void)
-{
- unsigned long vaddr, tte_data, idx;
-
- vaddr = POP();
- tte_data = POP();
- idx = POP();
- itlb_load3(vaddr, tte_data, idx);
-}
-
-/* MMU I-TLB miss handler */
-void
-itlb_miss_handler(void)
-{
- unsigned long faultva, tte_data = 0;
-
- /* Grab fault address from MMU and round to nearest 8k page */
- faultva = itlb_faultva();
- faultva >>= 13;
- faultva <<= 13;
-
- /* If a valid va>tte-data routine has been set, invoke that Forth xt instead */
- if (va2ttedata && *va2ttedata != 0) {
-
- /* va>tte-data ( addr cnum -- false | tte-data true ) */
- PUSH(faultva);
- PUSH(0);
- enterforth(*va2ttedata);
-
- /* Check the result first... */
- tte_data = POP();
- if (!tte_data) {
- bug();
- } else {
- /* Grab the real data */
- tte_data = POP();
- }
- } else {
- /* Search the ofmem linked list for this virtual address */
- tte_data = find_tte(faultva);
- }
-
- if (tte_data) {
- /* Update MMU */
- itlb_load2(faultva, tte_data);
- } else {
- /* If we got here, there was no translation so fail */
- bug();
- }
-}
-
-/*
- 3.6.5 map
- ( phys.lo ... phys.hi virt size mode -- )
-*/
-static void
-mmu_map(void)
-{
- ucell virt, size, mode;
- phys_addr_t phys;
-
- mode = POP();
- size = POP();
- virt = POP();
- phys = POP();
- phys <<= 32;
- phys |= POP();
-
- ofmem_map(phys, virt, size, mode);
-}
-
-/*
- 3.6.5 unmap
- ( virt size -- )
-*/
-static void
-mmu_unmap(void)
-{
- ucell virt, size;
-
- size = POP();
- virt = POP();
- ofmem_unmap(virt, size);
-}
-
-/*
- 3.6.5 claim
- ( virt size align -- base )
-*/
-static void
-mmu_claim(void)
-{
- ucell virt=-1UL, size, align;
-
- align = POP();
- size = POP();
- if (!align) {
- virt = POP();
- }
-
- virt = ofmem_claim_virt(virt, size, align);
-
- PUSH(virt);
-}
-
-/*
- 3.6.5 release
- ( virt size -- )
-*/
-static void
-mmu_release(void)
-{
- ucell virt, size;
-
- size = POP();
- virt = POP();
-
- ofmem_release_virt(virt, size);
-}
-
-/* ( phys size align --- base ) */
-static void
-mem_claim( void )
-{
- ucell size, align;
- phys_addr_t phys=-1UL;
-
- align = POP();
- size = POP();
- if (!align) {
- phys = POP();
- phys <<= 32;
- phys |= POP();
- }
-
- phys = ofmem_claim_phys(phys, size, align);
-
- PUSH(phys & 0xffffffffUL);
- PUSH(phys >> 32);
-}
-
-/* ( phys size --- ) */
-static void
-mem_release( void )
-{
- phys_addr_t phys;
- ucell size;
-
- size = POP();
- phys = POP();
- phys <<= 32;
- phys |= POP();
-
- ofmem_release_phys(phys, size);
-}
-
-/* ( name-cstr phys size align --- phys ) */
-static void
-mem_retain ( void )
-{
- ucell size, align;
- phys_addr_t phys=-1UL;
-
- align = POP();
- size = POP();
- if (!align) {
- phys = POP();
- phys <<= 32;
- phys |= POP();
- }
-
- /* Currently do nothing with the name */
- POP();
-
- phys = ofmem_retain(phys, size, align);
-
- PUSH(phys & 0xffffffffUL);
- PUSH(phys >> 32);
-}
-
-/* ( virt size align -- baseaddr|-1 ) */
-static void
-ciface_claim( void )
-{
- ucell align = POP();
- ucell size = POP();
- ucell virt = POP();
- ucell ret = ofmem_claim( virt, size, align );
-
- /* printk("ciface_claim: %08x %08x %x\n", virt, size, align ); */
- PUSH( ret );
-}
-
-/* ( virt size -- ) */
-static void
-ciface_release( void )
-{
- ucell size = POP();
- ucell virt = POP();
- ofmem_release(virt, size);
-}
-
-DECLARE_NODE(memory, INSTALL_OPEN, 0, "/memory");
-
-NODE_METHODS( memory ) = {
- { "claim", mem_claim },
- { "release", mem_release },
- { "SUNW,retain", mem_retain },
-};
-
-DECLARE_NODE(mmu, INSTALL_OPEN, 0, "/virtual-memory");
-
-NODE_METHODS(mmu) = {
- { "open", mmu_open },
- { "close", mmu_close },
- { "translate", mmu_translate },
- { "SUNW,dtlb-load", dtlb_load },
- { "SUNW,itlb-load", itlb_load },
- { "map", mmu_map },
- { "unmap", mmu_unmap },
- { "claim", mmu_claim },
- { "release", mmu_release },
-};
-
-void ob_mmu_init(const char *cpuname, uint64_t ram_size)
-{
- /* memory node */
- REGISTER_NODE(memory);
-
- /* MMU node */
- REGISTER_NODE(mmu);
-
- ofmem_register(find_dev("/memory"), find_dev("/virtual-memory"));
-
- push_str("/chosen");
- fword("find-device");
-
- push_str("/virtual-memory");
- fword("open-dev");
- fword("encode-int");
- push_str("mmu");
- fword("property");
-
- push_str("/memory");
- fword("find-device");
-
- /* All memory: 0 to RAM_size */
- PUSH(0);
- fword("encode-int");
- PUSH(0);
- fword("encode-int");
- fword("encode+");
- PUSH((int)(ram_size >> 32));
- fword("encode-int");
- fword("encode+");
- PUSH((int)(ram_size & 0xffffffff));
- fword("encode-int");
- fword("encode+");
- push_str("reg");
- fword("property");
-
- push_str("/openprom/client-services");
- fword("find-device");
- bind_func("cif-claim", ciface_claim);
- bind_func("cif-release", ciface_release);
-
- /* Other MMU functions */
- PUSH(0);
- fword("active-package!");
- bind_func("pgmap@", pgmap_fetch);
-
- /* Find address of va2ttedata defer word contents for MMU miss handlers */
- va2ttedata = (ucell *)findword("va>tte-data");
- va2ttedata++;
-}
diff --git a/qemu/roms/openbios/arch/sparc64/linux_load.c b/qemu/roms/openbios/arch/sparc64/linux_load.c
deleted file mode 100644
index e3afc2db8..000000000
--- a/qemu/roms/openbios/arch/sparc64/linux_load.c
+++ /dev/null
@@ -1,653 +0,0 @@
-/*
- * Linux/i386 loader
- * Supports bzImage, zImage and Image format.
- *
- * Based on work by Steve Gehlbach.
- * Portions are taken from mkelfImage.
- *
- * 2003-09 by SONE Takeshi
- */
-
-#include "config.h"
-#include "kernel/kernel.h"
-#include "libopenbios/bindings.h"
-#include "libopenbios/sys_info.h"
-#include "context.h"
-#include "libc/diskio.h"
-#include "boot.h"
-
-#define printf printk
-#define debug printk
-#define strtoull_with_suffix strtol
-
-#define LINUX_PARAM_LOC 0x90000
-#define COMMAND_LINE_LOC 0x91000
-#define GDT_LOC 0x92000
-#define STACK_LOC 0x93000
-
-#define E820MAX 32 /* number of entries in E820MAP */
-struct e820entry {
- unsigned long long addr; /* start of memory segment */
- unsigned long long size; /* size of memory segment */
- unsigned long type; /* type of memory segment */
-#define E820_RAM 1
-#define E820_RESERVED 2
-#define E820_ACPI 3 /* usable as RAM once ACPI tables have been read */
-#define E820_NVS 4
-};
-
-/* The header of Linux/i386 kernel */
-struct linux_header {
- uint8_t reserved1[0x1f1]; /* 0x000 */
- uint8_t setup_sects; /* 0x1f1 */
- uint16_t root_flags; /* 0x1f2 */
- uint8_t reserved2[6]; /* 0x1f4 */
- uint16_t vid_mode; /* 0x1fa */
- uint16_t root_dev; /* 0x1fc */
- uint16_t boot_sector_magic; /* 0x1fe */
- /* 2.00+ */
- uint8_t reserved3[2]; /* 0x200 */
- uint8_t header_magic[4]; /* 0x202 */
- uint16_t protocol_version; /* 0x206 */
- uint32_t realmode_swtch; /* 0x208 */
- uint16_t start_sys; /* 0x20c */
- uint16_t kver_addr; /* 0x20e */
- uint8_t type_of_loader; /* 0x210 */
- uint8_t loadflags; /* 0x211 */
- uint16_t setup_move_size; /* 0x212 */
- uint32_t code32_start; /* 0x214 */
- uint32_t ramdisk_image; /* 0x218 */
- uint32_t ramdisk_size; /* 0x21c */
- uint8_t reserved4[4]; /* 0x220 */
- /* 2.01+ */
- uint16_t heap_end_ptr; /* 0x224 */
- uint8_t reserved5[2]; /* 0x226 */
- /* 2.02+ */
- uint32_t cmd_line_ptr; /* 0x228 */
- /* 2.03+ */
- uint32_t initrd_addr_max; /* 0x22c */
-} __attribute__ ((packed));
-
-
-/* Paramters passed to 32-bit part of Linux
- * This is another view of the structure above.. */
-struct linux_params {
- uint8_t orig_x; /* 0x00 */
- uint8_t orig_y; /* 0x01 */
- uint16_t ext_mem_k; /* 0x02 -- EXT_MEM_K sits here */
- uint16_t orig_video_page; /* 0x04 */
- uint8_t orig_video_mode; /* 0x06 */
- uint8_t orig_video_cols; /* 0x07 */
- uint16_t unused2; /* 0x08 */
- uint16_t orig_video_ega_bx; /* 0x0a */
- uint16_t unused3; /* 0x0c */
- uint8_t orig_video_lines; /* 0x0e */
- uint8_t orig_video_isVGA; /* 0x0f */
- uint16_t orig_video_points; /* 0x10 */
-
- /* VESA graphic mode -- linear frame buffer */
- uint16_t lfb_width; /* 0x12 */
- uint16_t lfb_height; /* 0x14 */
- uint16_t lfb_depth; /* 0x16 */
- uint32_t lfb_base; /* 0x18 */
- uint32_t lfb_size; /* 0x1c */
- uint16_t cl_magic; /* 0x20 */
-#define CL_MAGIC_VALUE 0xA33F
- uint16_t cl_offset; /* 0x22 */
- uint16_t lfb_linelength; /* 0x24 */
- uint8_t red_size; /* 0x26 */
- uint8_t red_pos; /* 0x27 */
- uint8_t green_size; /* 0x28 */
- uint8_t green_pos; /* 0x29 */
- uint8_t blue_size; /* 0x2a */
- uint8_t blue_pos; /* 0x2b */
- uint8_t rsvd_size; /* 0x2c */
- uint8_t rsvd_pos; /* 0x2d */
- uint16_t vesapm_seg; /* 0x2e */
- uint16_t vesapm_off; /* 0x30 */
- uint16_t pages; /* 0x32 */
- uint8_t reserved4[12]; /* 0x34 -- 0x3f reserved for future expansion */
-
- //struct apm_bios_info apm_bios_info; /* 0x40 */
- uint8_t apm_bios_info[0x40];
- //struct drive_info_struct drive_info; /* 0x80 */
- uint8_t drive_info[0x20];
- //struct sys_desc_table sys_desc_table; /* 0xa0 */
- uint8_t sys_desc_table[0x140];
- uint32_t alt_mem_k; /* 0x1e0 */
- uint8_t reserved5[4]; /* 0x1e4 */
- uint8_t e820_map_nr; /* 0x1e8 */
- uint8_t reserved6[9]; /* 0x1e9 */
- uint16_t mount_root_rdonly; /* 0x1f2 */
- uint8_t reserved7[4]; /* 0x1f4 */
- uint16_t ramdisk_flags; /* 0x1f8 */
-#define RAMDISK_IMAGE_START_MASK 0x07FF
-#define RAMDISK_PROMPT_FLAG 0x8000
-#define RAMDISK_LOAD_FLAG 0x4000
- uint8_t reserved8[2]; /* 0x1fa */
- uint16_t orig_root_dev; /* 0x1fc */
- uint8_t reserved9[1]; /* 0x1fe */
- uint8_t aux_device_info; /* 0x1ff */
- uint8_t reserved10[2]; /* 0x200 */
- uint8_t param_block_signature[4]; /* 0x202 */
- uint16_t param_block_version; /* 0x206 */
- uint8_t reserved11[8]; /* 0x208 */
- uint8_t loader_type; /* 0x210 */
-#define LOADER_TYPE_LOADLIN 1
-#define LOADER_TYPE_BOOTSECT_LOADER 2
-#define LOADER_TYPE_SYSLINUX 3
-#define LOADER_TYPE_ETHERBOOT 4
-#define LOADER_TYPE_KERNEL 5
- uint8_t loader_flags; /* 0x211 */
- uint8_t reserved12[2]; /* 0x212 */
- uint32_t kernel_start; /* 0x214 */
- uint32_t initrd_start; /* 0x218 */
- uint32_t initrd_size; /* 0x21c */
- uint8_t reserved12_5[8]; /* 0x220 */
- uint32_t cmd_line_ptr; /* 0x228 */
- uint8_t reserved13[164]; /* 0x22c */
- struct e820entry e820_map[E820MAX]; /* 0x2d0 */
- uint8_t reserved16[688]; /* 0x550 */
-#define COMMAND_LINE_SIZE 256
- /* Command line is copied here by 32-bit i386/kernel/head.S.
- * So I will follow the boot protocol, rather than putting it
- * directly here. --ts1 */
- uint8_t command_line[COMMAND_LINE_SIZE]; /* 0x800 */
- uint8_t reserved17[1792]; /* 0x900 - 0x1000 */
-};
-
-static uint64_t forced_memsize;
-static int fd;
-
-static unsigned long file_size(void)
-{
- long long fpos, fsize;
-
- /* Save current position */
- fpos = tell(fd);
-
- /* Go to end of file and get position */
- seek_io(fd, -1);
- fsize = tell(fd);
-
- /* Go back to old position */
- seek_io(fd, 0);
- seek_io(fd, fpos);
-
- return fsize;
-}
-
-/* Load the first part the file and check if it's Linux */
-static uint32_t load_linux_header(struct linux_header *hdr)
-{
- int load_high;
- uint32_t kern_addr;
-
- if (read_io(fd, hdr, sizeof *hdr) != sizeof *hdr) {
- debug("Can't read Linux header\n");
- return 0;
- }
- if (hdr->boot_sector_magic != 0xaa55) {
- debug("Not a Linux kernel image\n");
- return 0;
- }
-
- /* Linux is found. Print some information */
- if (memcmp(hdr->header_magic, "HdrS", 4) != 0) {
- /* This may be floppy disk image or something.
- * Perform a simple (incomplete) sanity check. */
- if (hdr->setup_sects >= 16
- || file_size() - (hdr->setup_sects<<9) >= 512<<10) {
- debug("This looks like a bootdisk image but not like Linux...\n");
- return 0;
- }
-
- printf("Possible very old Linux");
- /* This kernel does not even have a protocol version.
- * Force the value. */
- hdr->protocol_version = 0; /* pre-2.00 */
- } else
- printf("Found Linux");
- if (hdr->protocol_version >= 0x200 && hdr->kver_addr) {
- char kver[256];
- seek_io(fd, hdr->kver_addr + 0x200);
- if (read_io(fd, kver, sizeof kver) != 0) {
- kver[255] = 0;
- printf(" version %s", kver);
- }
- }
- debug(" (protocol %#x)", hdr->protocol_version);
- load_high = 0;
- if (hdr->protocol_version >= 0x200) {
- debug(" (loadflags %#x)", hdr->loadflags);
- load_high = hdr->loadflags & 1;
- }
- if (load_high) {
- printf(" bzImage");
- kern_addr = 0x100000;
- } else {
- printf(" zImage or Image");
- kern_addr = 0x1000;
- }
- printf(".\n");
-
- return kern_addr;
-}
-
-/* Set up parameters for 32-bit kernel */
-static void
-init_linux_params(struct linux_params *params, struct linux_header *hdr)
-{
- debug("Setting up paramters at %#lx\n", virt_to_phys(params));
- memset(params, 0, sizeof *params);
-
- /* Copy some useful values from header */
- params->mount_root_rdonly = hdr->root_flags;
- params->orig_root_dev = hdr->root_dev;
-
- /* Video parameters.
- * This assumes we have VGA in standard 80x25 text mode,
- * just like our vga.c does.
- * Cursor position is filled later to allow some more printf's. */
- params->orig_video_mode = 3;
- params->orig_video_cols = 80;
- params->orig_video_lines = 25;
- params->orig_video_isVGA = 1;
- params->orig_video_points = 16;
-
- params->loader_type = 0xff; /* Unregistered Linux loader */
-}
-
-/* Memory map */
-static void
-set_memory_size(struct linux_params *params, struct sys_info *info)
-{
- int i;
- uint64_t end;
- uint32_t ramtop = 0;
- struct e820entry *linux_map;
- struct memrange *filo_map;
-
- linux_map = params->e820_map;
- filo_map = info->memrange;
- for (i = 0; i < info->n_memranges; i++, linux_map++, filo_map++) {
- if (i < E820MAX) {
- /* Convert to BIOS e820 style */
- linux_map->addr = filo_map->base;
- linux_map->size = filo_map->size;
- linux_map->type = E820_RAM;
- debug("%016Lx - %016Lx\n", linux_map->addr,
- linux_map->addr + linux_map->size);
- params->e820_map_nr = i+1;
- }
-
- /* Find out top of RAM. XXX This ignores hole above 1MB */
- end = filo_map->base + filo_map->size;
- if (end < (1ULL << 32)) { /* don't count memory above 4GB */
- if (end > ramtop)
- ramtop = (uint32_t) end;
- }
- }
- debug("ramtop=%#x\n", ramtop);
- /* Size of memory above 1MB in KB */
- params->alt_mem_k = (ramtop - (1<<20)) >> 10;
- /* old style, 64MB max */
- if (ramtop >= (64<<20))
- params->ext_mem_k = (63<<10);
- else
- params->ext_mem_k = params->alt_mem_k;
- debug("ext_mem_k=%d, alt_mem_k=%d\n", params->ext_mem_k, params->alt_mem_k);
-}
-
-/*
- * Parse command line
- * Some parameters, like initrd=<file>, are not passed to kernel,
- * we are responsible to process them.
- * Parameters for kernel are copied to kern_cmdline. Returns name of initrd.
- */
-static char *parse_command_line(const char *orig_cmdline, char *kern_cmdline)
-{
- const char *start, *sep, *end, *val;
- char name[64];
- unsigned long len;
- int k_len;
- int to_kern;
- char *initrd = NULL;
- int toolong = 0;
-
- forced_memsize = 0;
-
- if (!orig_cmdline) {
- *kern_cmdline = '\0';
- return NULL;
- }
-
- k_len = 0;
- debug("original command line: \"%s\"\n", orig_cmdline);
- debug("kernel command line at %#lx\n", virt_to_phys(kern_cmdline));
-
- start = orig_cmdline;
- while (*start == ' ')
- start++;
- while (*start) {
- end = strchr(start, ' ');
- if (!end)
- end = start + strlen(start);
- sep = strchr(start, '=');
- if (!sep || sep > end)
- sep = end;
- len = sep - start;
- if (len >= sizeof(name))
- len = sizeof(name) - 1;
- memcpy(name, start, len);
- name[len] = 0;
-
- if (*sep == '=') {
- val = sep + 1;
- len = end - val;
- } else {
- val = NULL;
- len = 0;
- }
-
- /* Only initrd= and mem= are handled here. vga= is not,
- * which I believe is a paramter to the realmode part of Linux,
- * which we don't execute. */
- if (strcmp(name, "initrd") == 0) {
- if (!val)
- printf("Missing filename to initrd parameter\n");
- else {
- initrd = malloc(len + 1);
- memcpy(initrd, val, len);
- initrd[len] = 0;
- debug("initrd=%s\n", initrd);
- }
- /* Don't pass this to kernel */
- to_kern = 0;
- } else if (strcmp(name, "mem") == 0) {
- if (!val)
- printf("Missing value for mem parameter\n");
- else {
- forced_memsize = strtoull_with_suffix(val, (char**)&val, 0);
- if (forced_memsize == 0)
- printf("Invalid mem option, ignored\n");
- if (val != end) {
- printf("Garbage after mem=<size>, ignored\n");
- forced_memsize = 0;
- }
- debug("mem=%llu\n", (unsigned long long)forced_memsize);
- }
- /* mem= is for both loader and kernel */
- to_kern = 1;
- } else
- to_kern = 1;
-
- if (to_kern) {
- /* Copy to kernel command line buffer */
- if (k_len != 0)
- kern_cmdline[k_len++] = ' '; /* put separator */
- len = end - start;
- if (k_len + len >= COMMAND_LINE_SIZE) {
- len = COMMAND_LINE_SIZE - k_len - 1;
- if (!toolong) {
- printf("Kernel command line is too long; truncated to "
- "%d bytes\n", COMMAND_LINE_SIZE-1);
- toolong = 1;
- }
- }
- memcpy(kern_cmdline + k_len, start, len);
- k_len += len;
- }
-
- start = end;
- while (*start == ' ')
- start++;
- }
- kern_cmdline[k_len] = 0;
- debug("kernel command line (%d bytes): \"%s\"\n", k_len, kern_cmdline);
-
- return initrd;
-}
-
-/* Set command line location */
-static void set_command_line_loc(struct linux_params *params,
- struct linux_header *hdr)
-{
- if (hdr->protocol_version >= 0x202) {
- /* new style */
- params->cmd_line_ptr = COMMAND_LINE_LOC;
- } else {
- /* old style */
- params->cl_magic = CL_MAGIC_VALUE;
- params->cl_offset = COMMAND_LINE_LOC - LINUX_PARAM_LOC;
- }
-}
-
-/* Load 32-bit part of kernel */
-static int load_linux_kernel(struct linux_header *hdr, uint32_t kern_addr)
-{
- uint32_t kern_offset, kern_size;
-
- if (hdr->setup_sects == 0)
- hdr->setup_sects = 4;
- kern_offset = (hdr->setup_sects + 1) * 512;
- seek_io(fd, kern_offset);
- kern_size = file_size() - kern_offset;
- debug("offset=%#x addr=%#x size=%#x\n", kern_offset, kern_addr, kern_size);
-
-#if 0
- if (using_devsize) {
- printf("Attempt to load up to end of device as kernel; "
- "specify the image size\n");
- return 0;
- }
-#endif
-
- printf("Loading kernel... ");
- if ((uint32_t)read_io(fd, phys_to_virt(kern_addr), kern_size) != kern_size) {
- printf("Can't read kernel\n");
- return 0;
- }
- printf("ok\n");
-
- return kern_size;
-}
-
-static int load_initrd(struct linux_header *hdr, uint32_t kern_end,
- struct linux_params *params, const char *initrd_file)
-{
- uint32_t max;
- uint32_t start, end, size;
- uint64_t forced;
-
- fd = open_io(initrd_file);
- if (fd == -1) {
- printf("Can't open initrd: %s\n", initrd_file);
- return -1;
- }
-
-#if 0
- if (using_devsize) {
- printf("Attempt to load up to end of device as initrd; "
- "specify the image size\n");
- return -1;
- }
-#endif
-
- size = file_size();
-
-
- /* Find out the kernel's restriction on how high the initrd can be
- * placed */
- if (hdr->protocol_version >= 0x203)
- max = hdr->initrd_addr_max;
- else
- max = 0x38000000; /* Hardcoded value for older kernels */
-
- /* FILO itself is at the top of RAM. (relocated)
- * So, try putting initrd just below us. */
- end = virt_to_phys(_start);
- if (end > max)
- end = max;
-
- /* If "mem=" option is given, we have to put the initrd within
- * the specified range. */
- if (forced_memsize) {
- forced = forced_memsize;
- if (forced > max)
- forced = max;
- /* If the "mem=" is lower, it's easy */
- if (forced <= end)
- end = forced;
- else {
- /* Otherwise, see if we can put it above us */
- if (virt_to_phys(_end) + size <= forced)
- end = forced; /* Ok */
- }
- }
-
- start = end - size;
- start &= ~0xfff; /* page align */
- end = start + size;
-
- debug("start=%#x end=%#x\n", start, end);
-
- if (start < kern_end) {
- printf("Initrd is too big to fit in memory\n");
- return -1;
- }
-
- printf("Loading initrd... ");
- if ((uint32_t)read_io(fd, phys_to_virt(start), size) != size) {
- printf("Can't read initrd\n");
- return -1;
- }
- printf("ok\n");
-
- params->initrd_start = start;
- params->initrd_size = size;
-
- close_io(fd);
-
- return 0;
-}
-
-static void hardware_setup(void)
-{
- /* Disable nmi */
- outb(0x80, 0x70);
-
- /* Make sure any coprocessor is properly reset.. */
- outb(0, 0xf0);
- outb(0, 0xf1);
-
- /* we're getting screwed again and again by this problem of the 8259.
- * so we're going to leave this lying around for inclusion into
- * crt0.S on an as-needed basis.
- *
- * well, that went ok, I hope. Now we have to reprogram the interrupts :-(
- * we put them right after the intel-reserved hardware interrupts, at
- * int 0x20-0x2F. There they won't mess up anything. Sadly IBM really
- * messed this up with the original PC, and they haven't been able to
- * rectify it afterwards. Thus the bios puts interrupts at 0x08-0x0f,
- * which is used for the internal hardware interrupts as well. We just
- * have to reprogram the 8259's, and it isn't fun.
- */
-
- outb(0x11, 0x20); /* initialization sequence to 8259A-1 */
- outb(0x11, 0xA0); /* and to 8259A-2 */
-
- outb(0x20, 0x21); /* start of hardware int's (0x20) */
- outb(0x28, 0xA1); /* start of hardware int's 2 (0x28) */
-
- outb(0x04, 0x21); /* 8259-1 is master */
- outb(0x02, 0xA1); /* 8259-2 is slave */
-
- outb(0x01, 0x21); /* 8086 mode for both */
- outb(0x01, 0xA1);
-
- outb(0xFF, 0xA1); /* mask off all interrupts for now */
- outb(0xFB, 0x21); /* mask all irq's but irq2 which is cascaded */
-}
-
-/* Start Linux */
-static int start_linux(uint32_t kern_addr)
-{
- struct context *ctx;
- //extern int cursor_x, cursor_y;
-
- ctx = init_context(phys_to_virt(STACK_LOC), 4096, 0);
-
- /* Entry point */
- ctx->pc = kern_addr;
- ctx->npc = kern_addr + 4;
-
- debug("pc=%#x\n", kern_addr);
- printf("Jumping to entry point...\n");
-
-#ifdef VGA_CONSOLE
- /* Update VGA cursor position.
- * This must be here because the printf changes the value! */
- params->orig_x = cursor_x;
- params->orig_y = cursor_y;
-#endif
-
- /* Go... */
- ctx = switch_to(ctx);
-
- /* It's impossible but... */
- printf("Returned with o0=%#llx\n", ctx->regs[REG_O0]);
-
- return ctx->regs[REG_O0];
-}
-
-int linux_load(struct sys_info *info, const char *file, const char *cmdline)
-{
- struct linux_header hdr;
- struct linux_params *params;
- uint32_t kern_addr, kern_size;
- char *initrd_file = NULL;
-
- fd = open_io(file);
- if (fd == -1)
- return -1;
-
- kern_addr = load_linux_header(&hdr);
- if (kern_addr == 0) {
- close_io(fd);
- return LOADER_NOT_SUPPORT;
- }
-
- debug("[sparc64] Booting kernel '%s' ", file);
- if (cmdline)
- debug("with parameters '%s'\n", cmdline);
- else
- debug("without parameters.\n");
-
- params = phys_to_virt(LINUX_PARAM_LOC);
- init_linux_params(params, &hdr);
- set_memory_size(params, info);
- initrd_file = parse_command_line(cmdline, phys_to_virt(COMMAND_LINE_LOC));
- set_command_line_loc(params, &hdr);
-
- kern_size = load_linux_kernel(&hdr, kern_addr);
- if (kern_size == 0) {
- if (initrd_file)
- free(initrd_file);
- return -1;
- }
-
- if (initrd_file) {
- if (load_initrd(&hdr, kern_addr+kern_size, params, initrd_file)
- != 0) {
- free(initrd_file);
- return -1;
- }
- free(initrd_file);
- }
-
- hardware_setup();
-
- start_linux(kern_addr);
- return 0;
-}
diff --git a/qemu/roms/openbios/arch/sparc64/lsu.h b/qemu/roms/openbios/arch/sparc64/lsu.h
deleted file mode 100644
index d85c33f24..000000000
--- a/qemu/roms/openbios/arch/sparc64/lsu.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* $Id: lsu.h,v 1.2 1997/04/04 00:50:22 davem Exp $ */
-#ifndef _SPARC64_LSU_H
-#define _SPARC64_LSU_H
-
-#include "const.h"
-
-/* LSU Control Register */
-#define LSU_CONTROL_PM _AC(0x000001fe00000000,UL) /* Phys-watchpoint byte mask*/
-#define LSU_CONTROL_VM _AC(0x00000001fe000000,UL) /* Virt-watchpoint byte mask*/
-#define LSU_CONTROL_PR _AC(0x0000000001000000,UL) /* Phys-rd watchpoint enable*/
-#define LSU_CONTROL_PW _AC(0x0000000000800000,UL) /* Phys-wr watchpoint enable*/
-#define LSU_CONTROL_VR _AC(0x0000000000400000,UL) /* Virt-rd watchpoint enable*/
-#define LSU_CONTROL_VW _AC(0x0000000000200000,UL) /* Virt-wr watchpoint enable*/
-#define LSU_CONTROL_FM _AC(0x00000000000ffff0,UL) /* Parity mask enables. */
-#define LSU_CONTROL_DM _AC(0x0000000000000008,UL) /* Data MMU enable. */
-#define LSU_CONTROL_IM _AC(0x0000000000000004,UL) /* Instruction MMU enable. */
-#define LSU_CONTROL_DC _AC(0x0000000000000002,UL) /* Data cache enable. */
-#define LSU_CONTROL_IC _AC(0x0000000000000001,UL) /* Instruction cache enable.*/
-
-#endif /* !(_SPARC64_LSU_H) */
diff --git a/qemu/roms/openbios/arch/sparc64/multiboot.c b/qemu/roms/openbios/arch/sparc64/multiboot.c
deleted file mode 100644
index 8514ca0a4..000000000
--- a/qemu/roms/openbios/arch/sparc64/multiboot.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/* Support for Multiboot */
-
-#include "config.h"
-#include "asm/io.h"
-#include "libopenbios/sys_info.h"
-#include "multiboot.h"
-
-#define printf printk
-#ifdef CONFIG_DEBUG_BOOT
-#define debug printk
-#else
-#define debug(x...)
-#endif
-
-struct mbheader {
- unsigned int magic, flags, checksum;
-};
-const struct mbheader multiboot_header
- __attribute__((section (".hdr"))) =
-{
- MULTIBOOT_HEADER_MAGIC,
- MULTIBOOT_HEADER_FLAGS,
- -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
-};
-
-/* Multiboot information structure, provided by loader to us */
-
-struct multiboot_mmap {
- unsigned entry_size;
- unsigned base_lo, base_hi;
- unsigned size_lo, size_hi;
- unsigned type;
-};
-
-#define MULTIBOOT_MEM_VALID 0x01
-#define MULTIBOOT_BOOT_DEV_VALID 0x02
-#define MULTIBOOT_CMDLINE_VALID 0x04
-#define MULTIBOOT_MODS_VALID 0x08
-#define MULTIBOOT_AOUT_SYMS_VALID 0x10
-#define MULTIBOOT_ELF_SYMS_VALID 0x20
-#define MULTIBOOT_MMAP_VALID 0x40
-
-void collect_multiboot_info(struct sys_info *info);
-void collect_multiboot_info(struct sys_info *info)
-{
- struct multiboot_info *mbinfo;
- struct multiboot_mmap *mbmem;
- unsigned mbcount, mbaddr;
- unsigned int i;
- struct memrange *mmap;
- int mmap_count;
- module_t *mod;
-
- if (info->boot_type != 0x2BADB002)
- return;
-
- debug("Using Multiboot information at %#lx\n", info->boot_data);
-
- mbinfo = phys_to_virt(info->boot_data);
-
- if (mbinfo->mods_count != 1) {
- printf("Multiboot: no dictionary\n");
- return;
- }
-
- mod = (module_t *) mbinfo->mods_addr;
- info->dict_start=(unsigned long *)mod->mod_start;
- info->dict_end=(unsigned long *)mod->mod_end;
-
- if (mbinfo->flags & MULTIBOOT_MMAP_VALID) {
- /* convert mmap records */
- mbmem = phys_to_virt(mbinfo->mmap_addr);
- mbcount = mbinfo->mmap_length / (mbmem->entry_size + 4);
- mmap = malloc(mbcount * sizeof(struct memrange));
- mmap_count = 0;
- mbaddr = mbinfo->mmap_addr;
- for (i = 0; i < mbcount; i++) {
- mbmem = phys_to_virt(mbaddr);
- debug("%08x%08x %08x%08x (%d)\n",
- mbmem->base_hi,
- mbmem->base_lo,
- mbmem->size_hi,
- mbmem->size_lo,
- mbmem->type);
- if (mbmem->type == 1) { /* Only normal RAM */
- mmap[mmap_count].base = mbmem->base_lo
- + (((unsigned long long) mbmem->base_hi) << 32);
- mmap[mmap_count].size = mbmem->size_lo
- + (((unsigned long long) mbmem->size_hi) << 32);
- mmap_count++;
- }
- mbaddr += mbmem->entry_size + 4;
- if (mbaddr >= mbinfo->mmap_addr + mbinfo->mmap_length)
- break;
- }
- /* simple sanity check - there should be at least 2 RAM segments
- * (base 640k and extended) */
- if (mmap_count >= 2)
- goto got_it;
-
- printf("Multiboot mmap is broken\n");
- free(mmap);
- /* fall back to mem_lower/mem_upper */
- }
-
- if (mbinfo->flags & MULTIBOOT_MEM_VALID) {
- /* use mem_lower and mem_upper */
- mmap_count = 2;
- mmap = malloc(2 * sizeof(*mmap));
- mmap[0].base = 0;
- mmap[0].size = mbinfo->mem_lower << 10;
- mmap[1].base = 1 << 20; /* 1MB */
- mmap[1].size = mbinfo->mem_upper << 10;
- goto got_it;
- }
-
- printf("Can't get memory information from Multiboot\n");
- return;
-
-got_it:
- info->memrange = mmap;
- info->n_memranges = mmap_count;
-
- return;
-}
diff --git a/qemu/roms/openbios/arch/sparc64/multiboot.h b/qemu/roms/openbios/arch/sparc64/multiboot.h
deleted file mode 100644
index 17cf202ec..000000000
--- a/qemu/roms/openbios/arch/sparc64/multiboot.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/* multiboot.h
- * tag: header for multiboot
- *
- * Copyright (C) 2003-2004 Stefan Reinauer
- *
- * See the file "COPYING" for further information about
- * the copyright and warranty status of this work.
- */
-
-/* magic number for multiboot header */
-#define MULTIBOOT_HEADER_MAGIC 0x1BADB002
-
-/* flags for multiboot header */
-#define MULTIBOOT_HEADER_FLAGS 0x00010003
-
-/* magic number passed by multiboot-compliant boot loader. */
-#define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002
-
-/* The size of our stack (8KB). */
-#define STACK_SIZE 0x2000
-
-/* C symbol format. HAVE_ASM_USCORE is defined by configure. */
-#ifdef HAVE_ASM_USCORE
-# define EXT_C(sym) _ ## sym
-#else
-# define EXT_C(sym) sym
-#endif
-
-#ifndef ASM
-/* We don't want these declarations in boot.S */
-
-/* multiboot header */
-typedef struct multiboot_header {
- unsigned long magic;
- unsigned long flags;
- unsigned long checksum;
- unsigned long header_addr;
- unsigned long load_addr;
- unsigned long load_end_addr;
- unsigned long bss_end_addr;
- unsigned long entry_addr;
-} multiboot_header_t;
-
-/* symbol table for a.out */
-typedef struct aout_symbol_table {
- unsigned long tabsize;
- unsigned long strsize;
- unsigned long addr;
- unsigned long reserved;
-} aout_symbol_table_t;
-
-/* section header table for ELF */
-typedef struct elf_section_header_table {
- unsigned long num;
- unsigned long size;
- unsigned long addr;
- unsigned long shndx;
-} elf_section_header_table_t;
-
-/* multiboot information */
-typedef struct multiboot_info {
- unsigned long flags;
- unsigned long mem_lower;
- unsigned long mem_upper;
- unsigned long boot_device;
- unsigned long cmdline;
- unsigned long mods_count;
- unsigned long mods_addr;
- union {
- aout_symbol_table_t aout_sym;
- elf_section_header_table_t elf_sec;
- } u;
- unsigned long mmap_length;
- unsigned long mmap_addr;
-} multiboot_info_t;
-
-/* module structure */
-typedef struct module {
- unsigned long mod_start;
- unsigned long mod_end;
- unsigned long string;
- unsigned long reserved;
-} module_t;
-
-/* memory map. Be careful that the offset 0 is base_addr_low
- but no size. */
-typedef struct memory_map {
- unsigned long size;
- unsigned long base_addr_low;
- unsigned long base_addr_high;
- unsigned long length_low;
- unsigned long length_high;
- unsigned long type;
-} memory_map_t;
-
-#endif /* ! ASM */
diff --git a/qemu/roms/openbios/arch/sparc64/ofmem_sparc64.c b/qemu/roms/openbios/arch/sparc64/ofmem_sparc64.c
deleted file mode 100644
index bdfaf5636..000000000
--- a/qemu/roms/openbios/arch/sparc64/ofmem_sparc64.c
+++ /dev/null
@@ -1,381 +0,0 @@
-/*
- * <ofmem_sparc64.c>
- *
- * OF Memory manager
- *
- * Copyright (C) 1999-2004 Samuel Rydh (samuel@ibrium.se)
- * Copyright (C) 2004 Stefan Reinauer
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation
- *
- */
-
-#include "config.h"
-#include "libopenbios/bindings.h"
-#include "libc/string.h"
-#include "arch/sparc64/ofmem_sparc64.h"
-#include "spitfire.h"
-
-#define OF_MALLOC_BASE ((char*)OFMEM + ALIGN_SIZE(sizeof(ofmem_t), 8))
-
-#define MEMSIZE (128 * 1024)
-static union {
- char memory[MEMSIZE];
- ofmem_t ofmem;
-} s_ofmem_data;
-
-#define OFMEM (&s_ofmem_data.ofmem)
-#define TOP_OF_RAM (s_ofmem_data.memory + MEMSIZE)
-
-static retain_t s_retained;
-translation_t **g_ofmem_translations = &s_ofmem_data.ofmem.trans;
-
-ucell *va2ttedata = 0;
-extern uint64_t qemu_mem_size;
-
-static inline size_t ALIGN_SIZE(size_t x, size_t a)
-{
- return (x + a - 1) & ~(a-1);
-}
-
-static ucell get_heap_top( void )
-{
- return (ucell)TOP_OF_RAM;
-}
-
-ofmem_t* ofmem_arch_get_private(void)
-{
- return OFMEM;
-}
-
-void* ofmem_arch_get_malloc_base(void)
-{
- return OF_MALLOC_BASE;
-}
-
-ucell ofmem_arch_get_heap_top(void)
-{
- return get_heap_top();
-}
-
-ucell ofmem_arch_get_virt_top(void)
-{
- return (ucell)TOP_OF_RAM;
-}
-
-ucell ofmem_arch_get_iomem_base(void)
-{
- /* Currently unused */
- return 0;
-}
-
-ucell ofmem_arch_get_iomem_top(void)
-{
- /* Currently unused */
- return 0;
-}
-
-retain_t *ofmem_arch_get_retained(void)
-{
- return (&s_retained);
-}
-
-int ofmem_arch_get_translation_entry_size(void)
-{
- /* Return size of a single MMU package translation property entry in cells */
- return 3;
-}
-
-void ofmem_arch_create_translation_entry(ucell *transentry, translation_t *t)
-{
- /* Generate translation property entry for SPARC. While there is no
- formal documentation for this, both Linux kernel and OpenSolaris sources
- expect a translation property entry to have the following layout:
-
- virtual address
- length
- mode (valid TTE for start of translation region)
- */
-
- transentry[0] = t->virt;
- transentry[1] = t->size;
- transentry[2] = t->phys | t->mode | SPITFIRE_TTE_VALID;
-}
-
-/* Return the size of a memory available entry given the phandle in cells */
-int ofmem_arch_get_available_entry_size(phandle_t ph)
-{
- if (ph == s_phandle_memory) {
- return 1 + ofmem_arch_get_physaddr_cellsize();
- } else {
- return 1 + 1;
- }
-}
-
-/* Generate memory available property entry for Sparc64 */
-void ofmem_arch_create_available_entry(phandle_t ph, ucell *availentry, phys_addr_t start, ucell size)
-{
- int i = 0;
-
- if (ph == s_phandle_memory) {
- i += ofmem_arch_encode_physaddr(availentry, start);
- } else {
- availentry[i++] = start;
- }
-
- availentry[i] = size;
-}
-
-/* Unmap a set of pages */
-void ofmem_arch_unmap_pages(ucell virt, ucell size)
-{
- ucell va;
-
- /* align address to 8k */
- virt &= ~PAGE_MASK_8K;
-
- /* align size to 8k */
- size = (size + PAGE_MASK_8K) & ~PAGE_MASK_8K;
-
- for (va = virt; va < virt + size; va += PAGE_SIZE_8K) {
- itlb_demap(va);
- dtlb_demap(va);
- }
-}
-
-/* Map a set of pages */
-void ofmem_arch_map_pages(phys_addr_t phys, ucell virt, ucell size, ucell mode)
-{
- unsigned long tte_data, currsize;
-
- /* Install locked tlb entries now */
- if (mode & SPITFIRE_TTE_LOCKED) {
-
- /* aligned to 8k page */
- size = (size + PAGE_MASK_8K) & ~PAGE_MASK_8K;
-
- while (size > 0) {
- currsize = size;
- if (currsize >= PAGE_SIZE_4M &&
- (virt & PAGE_MASK_4M) == 0 &&
- (phys & PAGE_MASK_4M) == 0) {
- currsize = PAGE_SIZE_4M;
- tte_data = 6ULL << 60;
- } else if (currsize >= PAGE_SIZE_512K &&
- (virt & PAGE_MASK_512K) == 0 &&
- (phys & PAGE_MASK_512K) == 0) {
- currsize = PAGE_SIZE_512K;
- tte_data = 4ULL << 60;
- } else if (currsize >= PAGE_SIZE_64K &&
- (virt & PAGE_MASK_64K) == 0 &&
- (phys & PAGE_MASK_64K) == 0) {
- currsize = PAGE_SIZE_64K;
- tte_data = 2ULL << 60;
- } else {
- currsize = PAGE_SIZE_8K;
- tte_data = 0;
- }
-
- tte_data |= phys | mode | SPITFIRE_TTE_VALID;
-
- itlb_load2(virt, tte_data);
- dtlb_load2(virt, tte_data);
-
- size -= currsize;
- phys += currsize;
- virt += currsize;
- }
- }
-}
-
-/************************************************************************/
-/* misc */
-/************************************************************************/
-
-int ofmem_arch_get_physaddr_cellsize(void)
-{
- return 1;
-}
-
-int ofmem_arch_encode_physaddr(ucell *p, phys_addr_t value)
-{
- p[0] = value;
- return 1;
-}
-
-ucell ofmem_arch_default_translation_mode( phys_addr_t phys )
-{
- /* Writable, cacheable */
- /* Privileged and not locked */
- return SPITFIRE_TTE_CP | SPITFIRE_TTE_CV | SPITFIRE_TTE_WRITABLE | SPITFIRE_TTE_PRIVILEGED;
-}
-
-ucell ofmem_arch_io_translation_mode( phys_addr_t phys )
-{
- /* Writable, privileged and not locked */
- return SPITFIRE_TTE_CV | SPITFIRE_TTE_WRITABLE | SPITFIRE_TTE_PRIVILEGED;
-}
-
-/* Architecture-specific OFMEM helpers */
-unsigned long
-find_tte(unsigned long va)
-{
- translation_t *t = *g_ofmem_translations;
- unsigned long tte_data;
-
- /* Search the ofmem linked list for this virtual address */
- while (t != NULL) {
- /* Find the correct range */
- if (va >= t->virt && va < (t->virt + t->size)) {
-
- /* valid tte, 8k size */
- tte_data = SPITFIRE_TTE_VALID;
-
- /* mix in phys address mode */
- tte_data |= t->mode;
-
- /* mix in page physical address = t->phys + offset */
- tte_data |= t->phys + (va - t->virt);
-
- /* return tte_data */
- return tte_data;
- }
- t = t->next;
- }
-
- /* Couldn't find tte */
- return -1;
-}
-
-/* ITLB handlers */
-void
-itlb_load2(unsigned long vaddr, unsigned long tte_data)
-{
- asm("stxa %0, [%1] %2\n"
- "stxa %3, [%%g0] %4\n"
- : : "r" (vaddr), "r" (48), "i" (ASI_IMMU),
- "r" (tte_data), "i" (ASI_ITLB_DATA_IN));
-}
-
-void
-itlb_load3(unsigned long vaddr, unsigned long tte_data,
- unsigned long tte_index)
-{
- asm("stxa %0, [%1] %2\n"
- "stxa %3, [%4] %5\n"
- : : "r" (vaddr), "r" (48), "i" (ASI_IMMU),
- "r" (tte_data), "r" (tte_index << 3), "i" (ASI_ITLB_DATA_ACCESS));
-}
-
-unsigned long
-itlb_faultva(void)
-{
- unsigned long faultva;
-
- asm("ldxa [%1] %2, %0\n"
- : "=r" (faultva)
- : "r" (48), "i" (ASI_IMMU));
-
- return faultva;
-}
-
-void
-itlb_demap(unsigned long vaddr)
-{
- asm("stxa %0, [%0] %1\n"
- : : "r" (vaddr), "i" (ASI_IMMU_DEMAP));
-}
-
-/* DTLB handlers */
-void
-dtlb_load2(unsigned long vaddr, unsigned long tte_data)
-{
- asm("stxa %0, [%1] %2\n"
- "stxa %3, [%%g0] %4\n"
- : : "r" (vaddr), "r" (48), "i" (ASI_DMMU),
- "r" (tte_data), "i" (ASI_DTLB_DATA_IN));
-}
-
-void
-dtlb_load3(unsigned long vaddr, unsigned long tte_data,
- unsigned long tte_index)
-{
- asm("stxa %0, [%1] %2\n"
- "stxa %3, [%4] %5\n"
- : : "r" (vaddr), "r" (48), "i" (ASI_DMMU),
- "r" (tte_data), "r" (tte_index << 3), "i" (ASI_DTLB_DATA_ACCESS));
-}
-
-unsigned long
-dtlb_faultva(void)
-{
- unsigned long faultva;
-
- asm("ldxa [%1] %2, %0\n"
- : "=r" (faultva)
- : "r" (48), "i" (ASI_DMMU));
-
- return faultva;
-}
-
-void
-dtlb_demap(unsigned long vaddr)
-{
- asm("stxa %0, [%0] %1\n"
- : : "r" (vaddr), "i" (ASI_DMMU_DEMAP));
-}
-
-/************************************************************************/
-/* init / cleanup */
-/************************************************************************/
-
-static int remap_page_range( phys_addr_t phys, ucell virt, ucell size, ucell mode )
-{
- ofmem_claim_phys(phys, size, 0);
- ofmem_claim_virt(virt, size, 0);
- ofmem_map_page_range(phys, virt, size, mode);
- if (!(mode & SPITFIRE_TTE_LOCKED)) {
- OFMEM_TRACE("remap_page_range clearing translation " FMT_ucellx
- " -> " FMT_ucellx " " FMT_ucellx " mode " FMT_ucellx "\n",
- virt, phys, size, mode );
- ofmem_arch_unmap_pages(virt, size);
- }
- return 0;
-}
-
-#define RETAIN_MAGIC 0x1100220033004400
-
-void ofmem_init( void )
-{
- retain_t *retained = ofmem_arch_get_retained();
- int i;
-
- memset(&s_ofmem_data, 0, sizeof(s_ofmem_data));
- s_ofmem_data.ofmem.ramsize = qemu_mem_size;
-
- /* inherit translations set up by entry.S */
- ofmem_walk_boot_map(remap_page_range);
-
- /* Map the memory */
- ofmem_map_page_range(PAGE_SIZE, PAGE_SIZE, 0x800000, 0x36);
-
- if (!(retained->magic == RETAIN_MAGIC)) {
- OFMEM_TRACE("ofmem_init: no retained magic found, creating\n");
- retained->magic = RETAIN_MAGIC;
- retained->numentries = 0;
- } else {
- OFMEM_TRACE("ofmem_init: retained magic found, total %lld mappings\n", retained->numentries);
-
- /* Mark physical addresses as used so they are not reallocated */
- for (i = 0; i < retained->numentries; i++) {
- ofmem_claim_phys(retained->retain_phys_range[i].start,
- retained->retain_phys_range[i].size, 0);
- }
-
- /* Reset retained area for next reset */
- retained->magic = RETAIN_MAGIC;
- retained->numentries = 0;
- }
-}
diff --git a/qemu/roms/openbios/arch/sparc64/openbios.c b/qemu/roms/openbios/arch/sparc64/openbios.c
deleted file mode 100644
index 4557f7f9f..000000000
--- a/qemu/roms/openbios/arch/sparc64/openbios.c
+++ /dev/null
@@ -1,664 +0,0 @@
-/* tag: openbios forth environment, executable code
- *
- * Copyright (C) 2003 Patrick Mauritz, Stefan Reinauer
- *
- * See the file "COPYING" for further information about
- * the copyright and warranty status of this work.
- */
-
-#include "config.h"
-#include "libopenbios/openbios.h"
-#include "libopenbios/bindings.h"
-#include "libopenbios/console.h"
-#include "drivers/drivers.h"
-#include "dict.h"
-#include "arch/common/nvram.h"
-#include "packages/nvram.h"
-#include "libopenbios/sys_info.h"
-#include "openbios.h"
-#include "drivers/pci.h"
-#include "asm/pci.h"
-#include "boot.h"
-#include "../../drivers/timer.h" // XXX
-#define NO_QEMU_PROTOS
-#include "arch/common/fw_cfg.h"
-#include "arch/sparc64/ofmem_sparc64.h"
-#include "spitfire.h"
-
-#define UUID_FMT "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
-
-#define APB_SPECIAL_BASE 0x1fe00000000ULL
-#define APB_MEM_BASE 0x1ff00000000ULL
-
-#define MEMORY_SIZE (512*1024) /* 512K ram for hosted system */
-
-// XXX
-#define NVRAM_BASE 0x2000
-#define NVRAM_SIZE 0x2000
-#define NVRAM_IDPROM 0x1fd8
-#define NVRAM_IDPROM_SIZE 32
-#define NVRAM_OB_START (0)
-#define NVRAM_OB_SIZE ((NVRAM_IDPROM - NVRAM_OB_START) & ~15)
-
-static uint8_t idprom[NVRAM_IDPROM_SIZE];
-
-struct hwdef {
- pci_arch_t pci;
- uint16_t machine_id_low, machine_id_high;
-};
-
-static const struct hwdef hwdefs[] = {
- {
- .pci = {
- .name = "SUNW,sabre",
- .vendor_id = PCI_VENDOR_ID_SUN,
- .device_id = PCI_DEVICE_ID_SUN_SABRE,
- .cfg_addr = APB_SPECIAL_BASE + 0x1000000ULL, // PCI bus configuration space
- .cfg_data = APB_MEM_BASE, // PCI bus memory space
- .cfg_base = APB_SPECIAL_BASE,
- .cfg_len = 0x2000000,
- .host_pci_base = APB_MEM_BASE,
- .pci_mem_base = 0x100000, /* avoid VGA at 0xa0000 */
- .mem_len = 0x10000000,
- .io_base = APB_SPECIAL_BASE + 0x2000000ULL, // PCI Bus I/O space
- .io_len = 0x10000,
- .irqs = { 0, 1, 2, 3 },
- },
- .machine_id_low = 0,
- .machine_id_high = 255,
- },
-};
-
-struct cpudef {
- unsigned long iu_version;
- const char *name;
- unsigned long ecache_associativity;
- unsigned long ecache_line_size;
- unsigned long ecache_size;
- unsigned long num_dtlb_entries;
- unsigned long dcache_associativity;
- unsigned long dcache_line_size;
- unsigned long dcache_size;
- unsigned long num_itlb_entries;
- unsigned long icache_associativity;
- unsigned long icache_line_size;
- unsigned long icache_size;
-};
-
-/*
- ( addr -- ? )
-*/
-
-extern volatile uint64_t client_tba;
-
-static void
-set_trap_table(void)
-{
- unsigned long addr;
-
- addr = POP();
-
- /* Update client_tba to be updated on CIF exit */
- client_tba = addr;
-}
-
-/* Reset control register is defined in 17.2.7.3 of US IIi User Manual */
-static void
-sparc64_reset_all(void)
-{
- unsigned long addr = 0x1fe0000f020ULL;
- unsigned long val = 1 << 29;
-
- asm("stxa %0, [%1] 0x15\n\t"
- : : "r" (val), "r" (addr) : "memory");
-}
-
-/* PCI Target Address Space Register (see UltraSPARC IIi User's Manual
- section 19.3.0.4) */
-#define PBM_PCI_TARGET_AS 0x2028
-#define PBM_PCI_TARGET_AS_CD_ENABLE 0x40
-
-static void
-sparc64_set_tas_register(unsigned long val)
-{
- unsigned long addr = APB_SPECIAL_BASE + PBM_PCI_TARGET_AS;
-
- asm("stxa %0, [%1] 0x15\n\t"
- : : "r" (val), "r" (addr) : "memory");
-}
-
-static void cpu_generic_init(const struct cpudef *cpu, uint32_t clock_frequency)
-{
- unsigned long iu_version;
-
- push_str("/");
- fword("find-device");
-
- fword("new-device");
-
- push_str(cpu->name);
- fword("device-name");
-
- push_str("cpu");
- fword("device-type");
-
- asm("rdpr %%ver, %0\n"
- : "=r"(iu_version) :);
-
- PUSH((iu_version >> 48) & 0xff);
- fword("encode-int");
- push_str("manufacturer#");
- fword("property");
-
- PUSH((iu_version >> 32) & 0xff);
- fword("encode-int");
- push_str("implementation#");
- fword("property");
-
- PUSH((iu_version >> 24) & 0xff);
- fword("encode-int");
- push_str("mask#");
- fword("property");
-
- PUSH(9);
- fword("encode-int");
- push_str("sparc-version");
- fword("property");
-
- PUSH(0);
- fword("encode-int");
- push_str("cpuid");
- fword("property");
-
- PUSH(0);
- fword("encode-int");
- push_str("upa-portid");
- fword("property");
-
- PUSH(clock_frequency);
- fword("encode-int");
- push_str("clock-frequency");
- fword("property");
-
- PUSH(cpu->ecache_associativity);
- fword("encode-int");
- push_str("ecache-associativity");
- fword("property");
-
- PUSH(cpu->ecache_line_size);
- fword("encode-int");
- push_str("ecache-line-size");
- fword("property");
-
- PUSH(cpu->ecache_size);
- fword("encode-int");
- push_str("ecache-size");
- fword("property");
-
- PUSH(cpu->dcache_associativity);
- fword("encode-int");
- push_str("dcache-associativity");
- fword("property");
-
- PUSH(cpu->dcache_line_size);
- fword("encode-int");
- push_str("dcache-line-size");
- fword("property");
-
- PUSH(cpu->dcache_size);
- fword("encode-int");
- push_str("dcache-size");
- fword("property");
-
- PUSH(cpu->icache_associativity);
- fword("encode-int");
- push_str("icache-associativity");
- fword("property");
-
- PUSH(cpu->ecache_line_size);
- fword("encode-int");
- push_str("icache-line-size");
- fword("property");
-
- PUSH(cpu->ecache_size);
- fword("encode-int");
- push_str("icache-size");
- fword("property");
-
- PUSH(cpu->num_itlb_entries);
- fword("encode-int");
- push_str("#itlb-entries");
- fword("property");
-
- PUSH(cpu->num_dtlb_entries);
- fword("encode-int");
- push_str("#dtlb-entries");
- fword("property");
-
- fword("finish-device");
-
- // Trap table
- push_str("/openprom/client-services");
- fword("find-device");
- bind_func("SUNW,set-trap-table", set_trap_table);
-
- // Reset
- bind_func("sparc64-reset-all", sparc64_reset_all);
- push_str("' sparc64-reset-all to reset-all");
- fword("eval");
-}
-
-static const struct cpudef sparc_defs[] = {
- {
- .iu_version = (0x04ULL << 48) | (0x02ULL << 32),
- .name = "FJSV,GP",
- },
- {
- .iu_version = (0x04ULL << 48) | (0x03ULL << 32),
- .name = "FJSV,GPUSK",
- },
- {
- .iu_version = (0x04ULL << 48) | (0x04ULL << 32),
- .name = "FJSV,GPUSC",
- },
- {
- .iu_version = (0x04ULL << 48) | (0x05ULL << 32),
- .name = "FJSV,GPUZC",
- },
- {
- .iu_version = (0x17ULL << 48) | (0x10ULL << 32),
- .name = "SUNW,UltraSPARC",
- .ecache_associativity = 1, .ecache_line_size = 0x40, .ecache_size = 0x100000,
- .dcache_associativity = 1, .dcache_line_size = 0x20, .dcache_size = 0x4000,
- .icache_associativity = 2, .icache_line_size = 0x20, .icache_size = 0x4000,
- .num_dtlb_entries = 0x40, .num_itlb_entries = 0x40,
- },
- {
- .iu_version = (0x17ULL << 48) | (0x11ULL << 32),
- .name = "SUNW,UltraSPARC-II",
- .ecache_associativity = 1, .ecache_line_size = 0x40, .ecache_size = 0x100000,
- .dcache_associativity = 1, .dcache_line_size = 0x20, .dcache_size = 0x4000,
- .icache_associativity = 2, .icache_line_size = 0x20, .icache_size = 0x4000,
- .num_dtlb_entries = 0x40, .num_itlb_entries = 0x40,
- },
- {
- .iu_version = (0x17ULL << 48) | (0x12ULL << 32),
- .name = "SUNW,UltraSPARC-IIi",
- .ecache_associativity = 1, .ecache_line_size = 0x40, .ecache_size = 0x40000,
- .dcache_associativity = 1, .dcache_line_size = 0x20, .dcache_size = 0x4000,
- .icache_associativity = 2, .icache_line_size = 0x20, .icache_size = 0x4000,
- .num_dtlb_entries = 0x40, .num_itlb_entries = 0x40,
- },
- {
- .iu_version = (0x17ULL << 48) | (0x13ULL << 32),
- .name = "SUNW,UltraSPARC-IIe",
- },
- {
- .iu_version = (0x3eULL << 48) | (0x14ULL << 32),
- .name = "SUNW,UltraSPARC-III",
- },
- {
- .iu_version = (0x3eULL << 48) | (0x15ULL << 32),
- .name = "SUNW,UltraSPARC-III+",
- },
- {
- .iu_version = (0x3eULL << 48) | (0x16ULL << 32),
- .name = "SUNW,UltraSPARC-IIIi",
- },
- {
- .iu_version = (0x3eULL << 48) | (0x18ULL << 32),
- .name = "SUNW,UltraSPARC-IV",
- },
- {
- .iu_version = (0x3eULL << 48) | (0x19ULL << 32),
- .name = "SUNW,UltraSPARC-IV+",
- },
- {
- .iu_version = (0x3eULL << 48) | (0x22ULL << 32),
- .name = "SUNW,UltraSPARC-IIIi+",
- },
- {
- .iu_version = (0x3eULL << 48) | (0x23ULL << 32),
- .name = "SUNW,UltraSPARC-T1",
- },
- {
- .iu_version = (0x3eULL << 48) | (0x24ULL << 32),
- .name = "SUNW,UltraSPARC-T2",
- },
- {
- .iu_version = (0x22ULL << 48) | (0x10ULL << 32),
- .name = "SUNW,UltraSPARC",
- },
-};
-
-static const struct cpudef *
-id_cpu(void)
-{
- unsigned long iu_version;
- unsigned int i;
-
- asm("rdpr %%ver, %0\n"
- : "=r"(iu_version) :);
- iu_version &= 0xffffffff00000000ULL;
-
- for (i = 0; i < sizeof(sparc_defs)/sizeof(struct cpudef); i++) {
- if (iu_version == sparc_defs[i].iu_version)
- return &sparc_defs[i];
- }
- printk("Unknown cpu (psr %lx), freezing!\n", iu_version);
- for (;;);
-}
-
-static void nvram_read(uint16_t offset, char *buf, unsigned int nbytes)
-{
- unsigned int i;
-
- for (i = 0; i < nbytes; i++) {
- buf[i] = inb(NVRAM_BASE + offset + i);
- }
-}
-
-static void nvram_write(uint16_t offset, const char *buf, unsigned int nbytes)
-{
- unsigned int i;
-
- for (i = 0; i < nbytes; i++) {
- outb(buf[i], NVRAM_BASE + offset + i);
- }
-}
-
-static uint8_t qemu_uuid[16];
-
-void arch_nvram_get(char *data)
-{
- char *obio_cmdline;
- uint32_t size = 0;
- const struct cpudef *cpu;
- char buf[256];
- uint32_t temp;
- uint64_t ram_size;
- uint32_t clock_frequency;
- uint16_t machine_id;
- const char *stdin_path, *stdout_path;
-
- fw_cfg_init();
-
- fw_cfg_read(FW_CFG_SIGNATURE, buf, 4);
- buf[4] = '\0';
-
- printk("Configuration device id %s", buf);
-
- temp = fw_cfg_read_i32(FW_CFG_ID);
- machine_id = fw_cfg_read_i16(FW_CFG_MACHINE_ID);
-
- printk(" version %d machine id %d\n", temp, machine_id);
-
- if (temp != 1) {
- printk("Incompatible configuration device version, freezing\n");
- for(;;);
- }
-
- kernel_size = fw_cfg_read_i32(FW_CFG_KERNEL_SIZE);
- if (kernel_size)
- kernel_image = fw_cfg_read_i64(FW_CFG_KERNEL_ADDR);
-
- size = fw_cfg_read_i32(FW_CFG_CMDLINE_SIZE);
- if (size) {
- obio_cmdline = (char *)malloc(size + 1);
- fw_cfg_read(FW_CFG_CMDLINE_DATA, obio_cmdline, size);
- obio_cmdline[size] = '\0';
- } else {
- obio_cmdline = strdup("");
- }
- qemu_cmdline = (uint64_t)obio_cmdline;
- cmdline_size = size;
- boot_device = fw_cfg_read_i16(FW_CFG_BOOT_DEVICE);
-
- if (kernel_size)
- printk("kernel addr %llx size %llx\n", kernel_image, kernel_size);
- if (size)
- printk("kernel cmdline %s\n", obio_cmdline);
-
- nvram_read(NVRAM_OB_START, data, NVRAM_OB_SIZE);
-
- temp = fw_cfg_read_i32(FW_CFG_NB_CPUS);
-
- printk("CPUs: %x", temp);
-
- clock_frequency = 100000000;
-
- cpu = id_cpu();
- //cpu->initfn();
- cpu_generic_init(cpu, clock_frequency);
- printk(" x %s\n", cpu->name);
-
- // Add /uuid
- fw_cfg_read(FW_CFG_UUID, (char *)qemu_uuid, 16);
-
- printk("UUID: " UUID_FMT "\n", qemu_uuid[0], qemu_uuid[1], qemu_uuid[2],
- qemu_uuid[3], qemu_uuid[4], qemu_uuid[5], qemu_uuid[6],
- qemu_uuid[7], qemu_uuid[8], qemu_uuid[9], qemu_uuid[10],
- qemu_uuid[11], qemu_uuid[12], qemu_uuid[13], qemu_uuid[14],
- qemu_uuid[15]);
-
- push_str("/");
- fword("find-device");
-
- PUSH((long)&qemu_uuid);
- PUSH(16);
- fword("encode-bytes");
- push_str("uuid");
- fword("property");
-
- // Add /idprom
- nvram_read(NVRAM_IDPROM, (char *)idprom, NVRAM_IDPROM_SIZE);
-
- PUSH((long)&idprom);
- PUSH(32);
- fword("encode-bytes");
- push_str("idprom");
- fword("property");
-
- PUSH(500 * 1000 * 1000);
- fword("encode-int");
- push_str("clock-frequency");
- fword("property");
-
- ram_size = fw_cfg_read_i64(FW_CFG_RAM_SIZE);
-
- ob_mmu_init(cpu->name, ram_size);
-
- /* Setup nvram variables */
- push_str("/options");
- fword("find-device");
-
- switch (boot_device) {
- case 'a':
- push_str("/obio/SUNW,fdtwo");
- break;
- case 'c':
- push_str("disk:a");
- break;
- default:
- case 'd':
- push_str("cdrom:f cdrom");
- break;
- case 'n':
- push_str("net");
- break;
- }
-
- fword("encode-string");
- push_str("boot-device");
- fword("property");
-
- push_str(obio_cmdline);
- fword("encode-string");
- push_str("boot-file");
- fword("property");
-
- /* Set up other properties */
- push_str("/chosen");
- fword("find-device");
-
- if (fw_cfg_read_i16(FW_CFG_NOGRAPHIC)) {
- stdin_path = stdout_path = "ttya";
- } else {
- stdin_path = "keyboard";
- stdout_path = "screen";
- }
-
- push_str(stdin_path);
- push_str("input-device");
- fword("$setenv");
-
- push_str(stdout_path);
- push_str("output-device");
- fword("$setenv");
-}
-
-void arch_nvram_put(char *data)
-{
- nvram_write(0, data, NVRAM_OB_SIZE);
-}
-
-int arch_nvram_size(void)
-{
- return NVRAM_OB_SIZE;
-}
-
-void setup_timers(void)
-{
-}
-
-void udelay(unsigned int usecs)
-{
- volatile int i;
-
- for (i = 0; i < usecs * 100; i++);
-}
-
-static void init_memory(void)
-{
- phys_addr_t phys;
- ucell virt;
-
- /* Claim the memory from OFMEM (align to 512K so we only take 1 TLB slot) */
- phys = ofmem_claim_phys(-1, MEMORY_SIZE, PAGE_SIZE_512K);
- if (!phys)
- printk("panic: not enough physical memory on host system.\n");
-
- virt = ofmem_claim_virt(-1, MEMORY_SIZE, PAGE_SIZE_512K);
- if (!virt)
- printk("panic: not enough virtual memory on host system.\n");
-
- /* Generate the mapping (and lock translation into the TLBs) */
- ofmem_map(phys, virt, MEMORY_SIZE, ofmem_arch_default_translation_mode(phys) | SPITFIRE_TTE_LOCKED);
-
- /* we push start and end of memory to the stack
- * so that it can be used by the forth word QUIT
- * to initialize the memory allocator
- */
-
- PUSH(virt);
- PUSH(virt + MEMORY_SIZE);
-}
-
-extern volatile uint64_t *obp_ticks_pointer;
-
-static void
-arch_init( void )
-{
- openbios_init();
- modules_init();
-#ifdef CONFIG_DRIVER_PCI
- ob_pci_init();
-
- /* Set TAS register to match the virtual-dma properties
- set during sabre configure */
- sparc64_set_tas_register(PBM_PCI_TARGET_AS_CD_ENABLE);
-#endif
- nvconf_init();
- device_end();
-
- /* Point to the Forth obp-ticks variable */
- fword("obp-ticks");
- obp_ticks_pointer = cell2pointer(POP());
-
- bind_func("platform-boot", boot );
- bind_func("(go)", go);
-}
-
-unsigned long isa_io_base;
-
-extern struct _console_ops arch_console_ops;
-
-int openbios(void)
-{
- unsigned int i;
- uint16_t machine_id;
- const struct hwdef *hwdef = NULL;
-
-
- for (i = 0; i < sizeof(hwdefs) / sizeof(struct hwdef); i++) {
- isa_io_base = hwdefs[i].pci.io_base;
- machine_id = fw_cfg_read_i16(FW_CFG_MACHINE_ID);
- if (hwdefs[i].machine_id_low <= machine_id &&
- hwdefs[i].machine_id_high >= machine_id) {
- hwdef = &hwdefs[i];
- arch = &hwdefs[i].pci;
- break;
- }
- }
- if (!hwdef)
- for(;;); // Internal inconsistency, hang
-
-#ifdef CONFIG_DEBUG_CONSOLE
- init_console(arch_console_ops);
-#ifdef CONFIG_DEBUG_CONSOLE_SERIAL
- uart_init(CONFIG_SERIAL_PORT, CONFIG_SERIAL_SPEED);
-#endif
- printk("OpenBIOS for Sparc64\n");
-#endif
-
- ofmem_init();
-
- collect_sys_info(&sys_info);
-
- dict = (unsigned char *)sys_info.dict_start;
- dicthead = (cell)sys_info.dict_end;
- last = sys_info.dict_last;
- dictlimit = sys_info.dict_limit;
-
- forth_init();
-
-#ifdef CONFIG_DEBUG_BOOT
- printk("forth started.\n");
- printk("initializing memory...");
-#endif
-
- init_memory();
-
-#ifdef CONFIG_DEBUG_BOOT
- printk("done\n");
-#endif
-
- PUSH_xt( bind_noname_func(arch_init) );
- fword("PREPOST-initializer");
-
- PC = (ucell)findword("initialize-of");
-
- if (!PC) {
- printk("panic: no dictionary entry point.\n");
- return -1;
- }
-#ifdef CONFIG_DEBUG_DICTIONARY
- printk("done (%d bytes).\n", dicthead);
- printk("Jumping to dictionary...\n");
-#endif
-
- enterforth((xt_t)PC);
- printk("falling off...\n");
- free(dict);
- return 0;
-}
diff --git a/qemu/roms/openbios/arch/sparc64/openbios.h b/qemu/roms/openbios/arch/sparc64/openbios.h
deleted file mode 100644
index 2146300d9..000000000
--- a/qemu/roms/openbios/arch/sparc64/openbios.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Creation Date: <2004/01/15 16:14:05 samuel>
- * Time-stamp: <2004/01/15 16:14:05 samuel>
- *
- * <openbios.h>
- *
- *
- *
- * Copyright (C) 2004 Samuel Rydh (samuel@ibrium.se)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2
- *
- */
-
-#ifndef _H_OPENBIOS
-#define _H_OPENBIOS
-
-int openbios(void);
-
-/* console.c */
-#ifdef CONFIG_DEBUG_CONSOLE
-extern void video_init(void);
-#endif
-
-#endif /* _H_OPENBIOS */
diff --git a/qemu/roms/openbios/arch/sparc64/openprom.h b/qemu/roms/openbios/arch/sparc64/openprom.h
deleted file mode 100644
index 0a336901d..000000000
--- a/qemu/roms/openbios/arch/sparc64/openprom.h
+++ /dev/null
@@ -1,281 +0,0 @@
-/* $Id: openprom.h,v 1.9 2001/03/16 10:22:02 davem Exp $ */
-#ifndef __SPARC64_OPENPROM_H
-#define __SPARC64_OPENPROM_H
-
-/* openprom.h: Prom structures and defines for access to the OPENBOOT
- * prom routines and data areas.
- *
- * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
- */
-
-#ifndef __ASSEMBLY__
-/* V0 prom device operations. */
-struct linux_dev_v0_funcs {
- int (*v0_devopen)(char *device_str);
- int (*v0_devclose)(int dev_desc);
- int (*v0_rdblkdev)(int dev_desc, int num_blks, int blk_st, char *buf);
- int (*v0_wrblkdev)(int dev_desc, int num_blks, int blk_st, char *buf);
- int (*v0_wrnetdev)(int dev_desc, int num_bytes, char *buf);
- int (*v0_rdnetdev)(int dev_desc, int num_bytes, char *buf);
- int (*v0_rdchardev)(int dev_desc, int num_bytes, int dummy, char *buf);
- int (*v0_wrchardev)(int dev_desc, int num_bytes, int dummy, char *buf);
- int (*v0_seekdev)(int dev_desc, long logical_offst, int from);
-};
-
-/* V2 and later prom device operations. */
-struct linux_dev_v2_funcs {
- int (*v2_inst2pkg)(int d); /* Convert ihandle to phandle */
- char * (*v2_dumb_mem_alloc)(char *va, unsigned sz);
- void (*v2_dumb_mem_free)(char *va, unsigned sz);
-
- /* To map devices into virtual I/O space. */
- char * (*v2_dumb_mmap)(char *virta, int which_io, unsigned paddr, unsigned sz);
- void (*v2_dumb_munmap)(char *virta, unsigned size);
-
- int (*v2_dev_open)(char *devpath);
- void (*v2_dev_close)(int d);
- int (*v2_dev_read)(int d, char *buf, int nbytes);
- int (*v2_dev_write)(int d, char *buf, int nbytes);
- int (*v2_dev_seek)(int d, int hi, int lo);
-
- /* Never issued (multistage load support) */
- void (*v2_wheee2)(void);
- void (*v2_wheee3)(void);
-};
-
-struct linux_mlist_v0 {
- struct linux_mlist_v0 *theres_more;
- unsigned start_adr;
- unsigned num_bytes;
-};
-
-struct linux_mem_v0 {
- struct linux_mlist_v0 **v0_totphys;
- struct linux_mlist_v0 **v0_prommap;
- struct linux_mlist_v0 **v0_available; /* What we can use */
-};
-
-/* Arguments sent to the kernel from the boot prompt. */
-struct linux_arguments_v0 {
- char *argv[8];
- char args[100];
- char boot_dev[2];
- int boot_dev_ctrl;
- int boot_dev_unit;
- int dev_partition;
- char *kernel_file_name;
- void *aieee1; /* XXX */
-};
-
-/* V2 and up boot things. */
-struct linux_bootargs_v2 {
- char **bootpath;
- char **bootargs;
- int *fd_stdin;
- int *fd_stdout;
-};
-
-/* The top level PROM vector. */
-struct linux_romvec {
- /* Version numbers. */
- unsigned int pv_magic_cookie;
- unsigned int pv_romvers;
- unsigned int pv_plugin_revision;
- unsigned int pv_printrev;
-
- /* Version 0 memory descriptors. */
- struct linux_mem_v0 pv_v0mem;
-
- /* Node operations. */
- struct linux_nodeops *pv_nodeops;
-
- char **pv_bootstr;
- struct linux_dev_v0_funcs pv_v0devops;
-
- char *pv_stdin;
- char *pv_stdout;
-#define PROMDEV_KBD 0 /* input from keyboard */
-#define PROMDEV_SCREEN 0 /* output to screen */
-#define PROMDEV_TTYA 1 /* in/out to ttya */
-#define PROMDEV_TTYB 2 /* in/out to ttyb */
-
- /* Blocking getchar/putchar. NOT REENTRANT! (grr) */
- int (*pv_getchar)(void);
- void (*pv_putchar)(int ch);
-
- /* Non-blocking variants. */
- int (*pv_nbgetchar)(void);
- int (*pv_nbputchar)(int ch);
-
- void (*pv_putstr)(char *str, int len);
-
- /* Miscellany. */
- void (*pv_reboot)(char *bootstr);
- void (*pv_printf)(__const__ char *fmt, ...);
- void (*pv_abort)(void);
- __volatile__ int *pv_ticks;
- void (*pv_halt)(void);
- void (**pv_synchook)(void);
-
- /* Evaluate a forth string, not different proto for V0 and V2->up. */
- union {
- void (*v0_eval)(int len, char *str);
- void (*v2_eval)(char *str);
- } pv_fortheval;
-
- struct linux_arguments_v0 **pv_v0bootargs;
-
- /* Get ether address. */
- unsigned int (*pv_enaddr)(int d, char *enaddr);
-
- struct linux_bootargs_v2 pv_v2bootargs;
- struct linux_dev_v2_funcs pv_v2devops;
-
- int filler[15];
-
- /* This one is sun4c/sun4 only. */
- void (*pv_setctxt)(int ctxt, char *va, int pmeg);
-
- /* Prom version 3 Multiprocessor routines. This stuff is crazy.
- * No joke. Calling these when there is only one cpu probably
- * crashes the machine, have to test this. :-)
- */
-
- /* v3_cpustart() will start the cpu 'whichcpu' in mmu-context
- * 'thiscontext' executing at address 'prog_counter'
- */
- int (*v3_cpustart)(unsigned int whichcpu, int ctxtbl_ptr,
- int thiscontext, char *prog_counter);
-
- /* v3_cpustop() will cause cpu 'whichcpu' to stop executing
- * until a resume cpu call is made.
- */
- int (*v3_cpustop)(unsigned int whichcpu);
-
- /* v3_cpuidle() will idle cpu 'whichcpu' until a stop or
- * resume cpu call is made.
- */
- int (*v3_cpuidle)(unsigned int whichcpu);
-
- /* v3_cpuresume() will resume processor 'whichcpu' executing
- * starting with whatever 'pc' and 'npc' were left at the
- * last 'idle' or 'stop' call.
- */
- int (*v3_cpuresume)(unsigned int whichcpu);
-};
-
-/* Routines for traversing the prom device tree. */
-struct linux_nodeops {
- int (*no_nextnode)(int node);
- int (*no_child)(int node);
- int (*no_proplen)(int node, char *name);
- int (*no_getprop)(int node, char *name, char *val);
- int (*no_setprop)(int node, char *name, char *val, int len);
- char * (*no_nextprop)(int node, char *name);
-};
-
-/* More fun PROM structures for device probing. */
-#define PROMREG_MAX 16
-#define PROMVADDR_MAX 16
-#define PROMINTR_MAX 15
-
-struct linux_prom_registers {
- unsigned which_io; /* hi part of physical address */
- unsigned phys_addr; /* The physical address of this register */
- int reg_size; /* How many bytes does this register take up? */
-};
-
-struct linux_prom64_registers {
- long phys_addr;
- long reg_size;
-};
-
-struct linux_prom_irqs {
- int pri; /* IRQ priority */
- int vector; /* This is foobar, what does it do? */
-};
-
-/* Element of the "ranges" vector */
-struct linux_prom_ranges {
- unsigned int ot_child_space;
- unsigned int ot_child_base; /* Bus feels this */
- unsigned int ot_parent_space;
- unsigned int ot_parent_base; /* CPU looks from here */
- unsigned int or_size;
-};
-
-struct linux_prom64_ranges {
- unsigned long ot_child_base; /* Bus feels this */
- unsigned long ot_parent_base; /* CPU looks from here */
- unsigned long or_size;
-};
-
-/* Ranges and reg properties are a bit different for PCI. */
-struct linux_prom_pci_registers {
- unsigned int phys_hi;
- unsigned int phys_mid;
- unsigned int phys_lo;
-
- unsigned int size_hi;
- unsigned int size_lo;
-};
-
-struct linux_prom_pci_ranges {
- unsigned int child_phys_hi; /* Only certain bits are encoded here. */
- unsigned int child_phys_mid;
- unsigned int child_phys_lo;
-
- unsigned int parent_phys_hi;
- unsigned int parent_phys_lo;
-
- unsigned int size_hi;
- unsigned int size_lo;
-};
-
-struct linux_prom_pci_intmap {
- unsigned int phys_hi;
- unsigned int phys_mid;
- unsigned int phys_lo;
-
- unsigned int interrupt;
-
- int cnode;
- unsigned int cinterrupt;
-};
-
-struct linux_prom_pci_intmask {
- unsigned int phys_hi;
- unsigned int phys_mid;
- unsigned int phys_lo;
- unsigned int interrupt;
-};
-
-struct linux_prom_ebus_ranges {
- unsigned int child_phys_hi;
- unsigned int child_phys_lo;
-
- unsigned int parent_phys_hi;
- unsigned int parent_phys_mid;
- unsigned int parent_phys_lo;
-
- unsigned int size;
-};
-
-struct linux_prom_ebus_intmap {
- unsigned int phys_hi;
- unsigned int phys_lo;
-
- unsigned int interrupt;
-
- int cnode;
- unsigned int cinterrupt;
-};
-
-struct linux_prom_ebus_intmask {
- unsigned int phys_hi;
- unsigned int phys_lo;
- unsigned int interrupt;
-};
-#endif /* !(__ASSEMBLY__) */
-
-#endif /* !(__SPARC64_OPENPROM_H) */
diff --git a/qemu/roms/openbios/arch/sparc64/plainboot.c b/qemu/roms/openbios/arch/sparc64/plainboot.c
deleted file mode 100644
index 08dab2d12..000000000
--- a/qemu/roms/openbios/arch/sparc64/plainboot.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* tag: openbios fixed address forth starter
- *
- * Copyright (C) 2003 Stefan Reinauer
- *
- * See the file "COPYING" for further information about
- * the copyright and warranty status of this work.
- */
-
-#include "config.h"
-#include "libopenbios/sys_info.h"
-#include "multiboot.h"
-
-#define FIXED_DICTSTART 0xfffe0000
-#define FIXED_DICTEND 0xfffeffff
-
-void collect_multiboot_info(struct sys_info *info);
-void collect_multiboot_info(struct sys_info *info)
-{
- info->dict_start=(unsigned long *)FIXED_DICTSTART;
- info->dict_end=(unsigned long *)FIXED_DICTEND;
-}
diff --git a/qemu/roms/openbios/arch/sparc64/pstate.h b/qemu/roms/openbios/arch/sparc64/pstate.h
deleted file mode 100644
index f32d6f7db..000000000
--- a/qemu/roms/openbios/arch/sparc64/pstate.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/* $Id: pstate.h,v 1.6 1997/06/25 07:39:45 jj Exp $ */
-#ifndef _SPARC64_PSTATE_H
-#define _SPARC64_PSTATE_H
-
-#include "const.h"
-
-/* The V9 PSTATE Register (with SpitFire extensions).
- *
- * -----------------------------------------------------------------------
- * | Resv | IG | MG | CLE | TLE | MM | RED | PEF | AM | PRIV | IE | AG |
- * -----------------------------------------------------------------------
- * 63 12 11 10 9 8 7 6 5 4 3 2 1 0
- */
-#define PSTATE_IG _AC(0x0000000000000800,UL) /* Interrupt Globals. */
-#define PSTATE_MG _AC(0x0000000000000400,UL) /* MMU Globals. */
-#define PSTATE_CLE _AC(0x0000000000000200,UL) /* Current Little Endian.*/
-#define PSTATE_TLE _AC(0x0000000000000100,UL) /* Trap Little Endian. */
-#define PSTATE_MM _AC(0x00000000000000c0,UL) /* Memory Model. */
-#define PSTATE_TSO _AC(0x0000000000000000,UL) /* MM: TotalStoreOrder */
-#define PSTATE_PSO _AC(0x0000000000000040,UL) /* MM: PartialStoreOrder */
-#define PSTATE_RMO _AC(0x0000000000000080,UL) /* MM: RelaxedMemoryOrder*/
-#define PSTATE_RED _AC(0x0000000000000020,UL) /* Reset Error Debug. */
-#define PSTATE_PEF _AC(0x0000000000000010,UL) /* Floating Point Enable.*/
-#define PSTATE_AM _AC(0x0000000000000008,UL) /* Address Mask. */
-#define PSTATE_PRIV _AC(0x0000000000000004,UL) /* Privilege. */
-#define PSTATE_IE _AC(0x0000000000000002,UL) /* Interrupt Enable. */
-#define PSTATE_AG _AC(0x0000000000000001,UL) /* Alternate Globals. */
-
-/* The V9 TSTATE Register (with SpitFire and Linux extensions).
- *
- * ---------------------------------------------------------------
- * | Resv | CCR | ASI | %pil | PSTATE | Resv | CWP |
- * ---------------------------------------------------------------
- * 63 40 39 32 31 24 23 20 19 8 7 5 4 0
- */
-#define TSTATE_CCR _AC(0x000000ff00000000,UL) /* Condition Codes. */
-#define TSTATE_XCC _AC(0x000000f000000000,UL) /* Condition Codes. */
-#define TSTATE_XNEG _AC(0x0000008000000000,UL) /* %xcc Negative. */
-#define TSTATE_XZERO _AC(0x0000004000000000,UL) /* %xcc Zero. */
-#define TSTATE_XOVFL _AC(0x0000002000000000,UL) /* %xcc Overflow. */
-#define TSTATE_XCARRY _AC(0x0000001000000000,UL) /* %xcc Carry. */
-#define TSTATE_ICC _AC(0x0000000f00000000,UL) /* Condition Codes. */
-#define TSTATE_INEG _AC(0x0000000800000000,UL) /* %icc Negative. */
-#define TSTATE_IZERO _AC(0x0000000400000000,UL) /* %icc Zero. */
-#define TSTATE_IOVFL _AC(0x0000000200000000,UL) /* %icc Overflow. */
-#define TSTATE_ICARRY _AC(0x0000000100000000,UL) /* %icc Carry. */
-#define TSTATE_ASI _AC(0x00000000ff000000,UL) /* AddrSpace ID. */
-#define TSTATE_PIL _AC(0x0000000000f00000,UL) /* %pil (Linux traps)*/
-#define TSTATE_PSTATE _AC(0x00000000000fff00,UL) /* PSTATE. */
-#define TSTATE_IG _AC(0x0000000000080000,UL) /* Interrupt Globals.*/
-#define TSTATE_MG _AC(0x0000000000040000,UL) /* MMU Globals. */
-#define TSTATE_CLE _AC(0x0000000000020000,UL) /* CurrLittleEndian. */
-#define TSTATE_TLE _AC(0x0000000000010000,UL) /* TrapLittleEndian. */
-#define TSTATE_MM _AC(0x000000000000c000,UL) /* Memory Model. */
-#define TSTATE_TSO _AC(0x0000000000000000,UL) /* MM: TSO */
-#define TSTATE_PSO _AC(0x0000000000004000,UL) /* MM: PSO */
-#define TSTATE_RMO _AC(0x0000000000008000,UL) /* MM: RMO */
-#define TSTATE_RED _AC(0x0000000000002000,UL) /* Reset Error Debug.*/
-#define TSTATE_PEF _AC(0x0000000000001000,UL) /* FPU Enable. */
-#define TSTATE_AM _AC(0x0000000000000800,UL) /* Address Mask. */
-#define TSTATE_PRIV _AC(0x0000000000000400,UL) /* Privilege. */
-#define TSTATE_IE _AC(0x0000000000000200,UL) /* Interrupt Enable. */
-#define TSTATE_AG _AC(0x0000000000000100,UL) /* Alternate Globals.*/
-#define TSTATE_CWP _AC(0x000000000000001f,UL) /* Curr Win-Pointer. */
-
-/* Floating-Point Registers State Register.
- *
- * --------------------------------
- * | Resv | FEF | DU | DL |
- * --------------------------------
- * 63 3 2 1 0
- */
-#define FPRS_FEF _AC(0x0000000000000004,UL) /* FPU Enable. */
-#define FPRS_DU _AC(0x0000000000000002,UL) /* Dirty Upper. */
-#define FPRS_DL _AC(0x0000000000000001,UL) /* Dirty Lower. */
-
-/* Version Register.
- *
- * ------------------------------------------------------
- * | MANUF | IMPL | MASK | Resv | MAXTL | Resv | MAXWIN |
- * ------------------------------------------------------
- * 63 48 47 32 31 24 23 16 15 8 7 5 4 0
- */
-#define VERS_MANUF _AC(0xffff000000000000,UL) /* Manufacturer. */
-#define VERS_IMPL _AC(0x0000ffff00000000,UL) /* Implementation. */
-#define VERS_MASK _AC(0x00000000ff000000,UL) /* Mask Set Revision.*/
-#define VERS_MAXTL _AC(0x000000000000ff00,UL) /* Max Trap Level. */
-#define VERS_MAXWIN _AC(0x000000000000001f,UL) /* Max RegWindow Idx.*/
-
-#endif /* !(_SPARC64_PSTATE_H) */
diff --git a/qemu/roms/openbios/arch/sparc64/spitfire.h b/qemu/roms/openbios/arch/sparc64/spitfire.h
deleted file mode 100644
index 4a951b1fb..000000000
--- a/qemu/roms/openbios/arch/sparc64/spitfire.h
+++ /dev/null
@@ -1,510 +0,0 @@
-/* $Id: spitfire.h,v 1.18 2001/11/29 16:42:10 kanoj Exp $
- * spitfire.h: SpitFire/BlackBird/Cheetah inline MMU operations.
- *
- * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
- */
-
-#ifndef _SPARC64_SPITFIRE_H
-#define _SPARC64_SPITFIRE_H
-
-#include <asm/asi.h>
-
-/* The following register addresses are accessible via ASI_DMMU
- * and ASI_IMMU, that is there is a distinct and unique copy of
- * each these registers for each TLB.
- */
-#define TSB_TAG_TARGET 0x0000000000000000 /* All chips */
-#define TLB_SFSR 0x0000000000000018 /* All chips */
-#define TSB_REG 0x0000000000000028 /* All chips */
-#define TLB_TAG_ACCESS 0x0000000000000030 /* All chips */
-#define VIRT_WATCHPOINT 0x0000000000000038 /* All chips */
-#define PHYS_WATCHPOINT 0x0000000000000040 /* All chips */
-#define TSB_EXTENSION_P 0x0000000000000048 /* Ultra-III and later */
-#define TSB_EXTENSION_S 0x0000000000000050 /* Ultra-III and later, D-TLB only */
-#define TSB_EXTENSION_N 0x0000000000000058 /* Ultra-III and later */
-#define TLB_TAG_ACCESS_EXT 0x0000000000000060 /* Ultra-III+ and later */
-
-/* These registers only exist as one entity, and are accessed
- * via ASI_DMMU only.
- */
-#define PRIMARY_CONTEXT 0x0000000000000008
-#define SECONDARY_CONTEXT 0x0000000000000010
-#define DMMU_SFAR 0x0000000000000020
-#define VIRT_WATCHPOINT 0x0000000000000038
-#define PHYS_WATCHPOINT 0x0000000000000040
-
-#define SPITFIRE_HIGHEST_LOCKED_TLBENT (64 - 1)
-
-/* translation table entry bits */
-#define SPITFIRE_TTE_WRITABLE 0x02
-#define SPITFIRE_TTE_PRIVILEGED 0x04
-#define SPITFIRE_TTE_CV 0x10
-#define SPITFIRE_TTE_CP 0x20
-#define SPITFIRE_TTE_LOCKED 0x40
-#define SPITFIRE_TTE_VALID 0x8000000000000000ULL
-
-#ifndef __ASSEMBLY__
-
-enum ultra_tlb_layout {
- spitfire = 0,
- cheetah = 1,
- cheetah_plus = 2,
-};
-
-extern enum ultra_tlb_layout tlb_type;
-
-#define CHEETAH_HIGHEST_LOCKED_TLBENT (16 - 1)
-
-#define L1DCACHE_SIZE 0x4000
-
-#define sparc64_highest_locked_tlbent() \
- (tlb_type == spitfire ? \
- SPITFIRE_HIGHEST_LOCKED_TLBENT : \
- CHEETAH_HIGHEST_LOCKED_TLBENT)
-
-static __inline__ unsigned long spitfire_get_isfsr(void)
-{
- unsigned long ret;
-
- __asm__ __volatile__("ldxa [%1] %2, %0"
- : "=r" (ret)
- : "r" (TLB_SFSR), "i" (ASI_IMMU));
- return ret;
-}
-
-static __inline__ unsigned long spitfire_get_dsfsr(void)
-{
- unsigned long ret;
-
- __asm__ __volatile__("ldxa [%1] %2, %0"
- : "=r" (ret)
- : "r" (TLB_SFSR), "i" (ASI_DMMU));
- return ret;
-}
-
-static __inline__ unsigned long spitfire_get_sfar(void)
-{
- unsigned long ret;
-
- __asm__ __volatile__("ldxa [%1] %2, %0"
- : "=r" (ret)
- : "r" (DMMU_SFAR), "i" (ASI_DMMU));
- return ret;
-}
-
-static __inline__ void spitfire_put_isfsr(unsigned long sfsr)
-{
- __asm__ __volatile__("stxa %0, [%1] %2\n\t"
- "membar #Sync"
- : /* no outputs */
- : "r" (sfsr), "r" (TLB_SFSR), "i" (ASI_IMMU));
-}
-
-static __inline__ void spitfire_put_dsfsr(unsigned long sfsr)
-{
- __asm__ __volatile__("stxa %0, [%1] %2\n\t"
- "membar #Sync"
- : /* no outputs */
- : "r" (sfsr), "r" (TLB_SFSR), "i" (ASI_DMMU));
-}
-
-static __inline__ unsigned long spitfire_get_primary_context(void)
-{
- unsigned long ctx;
-
- __asm__ __volatile__("ldxa [%1] %2, %0"
- : "=r" (ctx)
- : "r" (PRIMARY_CONTEXT), "i" (ASI_DMMU));
- return ctx;
-}
-
-static __inline__ void spitfire_set_primary_context(unsigned long ctx)
-{
- __asm__ __volatile__("stxa %0, [%1] %2\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (ctx & 0x3ff),
- "r" (PRIMARY_CONTEXT), "i" (ASI_DMMU));
- __asm__ __volatile__ ("membar #Sync" : : : "memory");
-}
-
-static __inline__ unsigned long spitfire_get_secondary_context(void)
-{
- unsigned long ctx;
-
- __asm__ __volatile__("ldxa [%1] %2, %0"
- : "=r" (ctx)
- : "r" (SECONDARY_CONTEXT), "i" (ASI_DMMU));
- return ctx;
-}
-
-static __inline__ void spitfire_set_secondary_context(unsigned long ctx)
-{
- __asm__ __volatile__("stxa %0, [%1] %2\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (ctx & 0x3ff),
- "r" (SECONDARY_CONTEXT), "i" (ASI_DMMU));
- __asm__ __volatile__ ("membar #Sync" : : : "memory");
-}
-
-/* The data cache is write through, so this just invalidates the
- * specified line.
- */
-static __inline__ void spitfire_put_dcache_tag(unsigned long addr, unsigned long tag)
-{
- __asm__ __volatile__("stxa %0, [%1] %2\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (tag), "r" (addr), "i" (ASI_DCACHE_TAG));
- __asm__ __volatile__ ("membar #Sync" : : : "memory");
-}
-
-/* The instruction cache lines are flushed with this, but note that
- * this does not flush the pipeline. It is possible for a line to
- * get flushed but stale instructions to still be in the pipeline,
- * a flush instruction (to any address) is sufficient to handle
- * this issue after the line is invalidated.
- */
-static __inline__ void spitfire_put_icache_tag(unsigned long addr, unsigned long tag)
-{
- __asm__ __volatile__("stxa %0, [%1] %2\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (tag), "r" (addr), "i" (ASI_IC_TAG));
-}
-
-static __inline__ unsigned long spitfire_get_dtlb_data(int entry)
-{
- unsigned long data;
-
- __asm__ __volatile__("ldxa [%1] %2, %0"
- : "=r" (data)
- : "r" (entry << 3), "i" (ASI_DTLB_DATA_ACCESS));
-
- /* Clear TTE diag bits. */
- data &= ~0x0003fe0000000000UL;
-
- return data;
-}
-
-static __inline__ unsigned long spitfire_get_dtlb_tag(int entry)
-{
- unsigned long tag;
-
- __asm__ __volatile__("ldxa [%1] %2, %0"
- : "=r" (tag)
- : "r" (entry << 3), "i" (ASI_DTLB_TAG_READ));
- return tag;
-}
-
-static __inline__ void spitfire_put_dtlb_data(int entry, unsigned long data)
-{
- __asm__ __volatile__("stxa %0, [%1] %2\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (data), "r" (entry << 3),
- "i" (ASI_DTLB_DATA_ACCESS));
-}
-
-static __inline__ unsigned long spitfire_get_itlb_data(int entry)
-{
- unsigned long data;
-
- __asm__ __volatile__("ldxa [%1] %2, %0"
- : "=r" (data)
- : "r" (entry << 3), "i" (ASI_ITLB_DATA_ACCESS));
-
- /* Clear TTE diag bits. */
- data &= ~0x0003fe0000000000UL;
-
- return data;
-}
-
-static __inline__ unsigned long spitfire_get_itlb_tag(int entry)
-{
- unsigned long tag;
-
- __asm__ __volatile__("ldxa [%1] %2, %0"
- : "=r" (tag)
- : "r" (entry << 3), "i" (ASI_ITLB_TAG_READ));
- return tag;
-}
-
-static __inline__ void spitfire_put_itlb_data(int entry, unsigned long data)
-{
- __asm__ __volatile__("stxa %0, [%1] %2\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (data), "r" (entry << 3),
- "i" (ASI_ITLB_DATA_ACCESS));
-}
-
-/* Spitfire hardware assisted TLB flushes. */
-
-/* Context level flushes. */
-static __inline__ void spitfire_flush_dtlb_primary_context(void)
-{
- __asm__ __volatile__("stxa %%g0, [%0] %1\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (0x40), "i" (ASI_DMMU_DEMAP));
-}
-
-static __inline__ void spitfire_flush_itlb_primary_context(void)
-{
- __asm__ __volatile__("stxa %%g0, [%0] %1\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (0x40), "i" (ASI_IMMU_DEMAP));
-}
-
-static __inline__ void spitfire_flush_dtlb_secondary_context(void)
-{
- __asm__ __volatile__("stxa %%g0, [%0] %1\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (0x50), "i" (ASI_DMMU_DEMAP));
-}
-
-static __inline__ void spitfire_flush_itlb_secondary_context(void)
-{
- __asm__ __volatile__("stxa %%g0, [%0] %1\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (0x50), "i" (ASI_IMMU_DEMAP));
-}
-
-static __inline__ void spitfire_flush_dtlb_nucleus_context(void)
-{
- __asm__ __volatile__("stxa %%g0, [%0] %1\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (0x60), "i" (ASI_DMMU_DEMAP));
-}
-
-static __inline__ void spitfire_flush_itlb_nucleus_context(void)
-{
- __asm__ __volatile__("stxa %%g0, [%0] %1\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (0x60), "i" (ASI_IMMU_DEMAP));
-}
-
-/* Page level flushes. */
-static __inline__ void spitfire_flush_dtlb_primary_page(unsigned long page)
-{
- __asm__ __volatile__("stxa %%g0, [%0] %1\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (page), "i" (ASI_DMMU_DEMAP));
-}
-
-static __inline__ void spitfire_flush_itlb_primary_page(unsigned long page)
-{
- __asm__ __volatile__("stxa %%g0, [%0] %1\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (page), "i" (ASI_IMMU_DEMAP));
-}
-
-static __inline__ void spitfire_flush_dtlb_secondary_page(unsigned long page)
-{
- __asm__ __volatile__("stxa %%g0, [%0] %1\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (page | 0x10), "i" (ASI_DMMU_DEMAP));
-}
-
-static __inline__ void spitfire_flush_itlb_secondary_page(unsigned long page)
-{
- __asm__ __volatile__("stxa %%g0, [%0] %1\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (page | 0x10), "i" (ASI_IMMU_DEMAP));
-}
-
-static __inline__ void spitfire_flush_dtlb_nucleus_page(unsigned long page)
-{
- __asm__ __volatile__("stxa %%g0, [%0] %1\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (page | 0x20), "i" (ASI_DMMU_DEMAP));
-}
-
-static __inline__ void spitfire_flush_itlb_nucleus_page(unsigned long page)
-{
- __asm__ __volatile__("stxa %%g0, [%0] %1\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (page | 0x20), "i" (ASI_IMMU_DEMAP));
-}
-
-/* Cheetah has "all non-locked" tlb flushes. */
-static __inline__ void cheetah_flush_dtlb_all(void)
-{
- __asm__ __volatile__("stxa %%g0, [%0] %1\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (0x80), "i" (ASI_DMMU_DEMAP));
-}
-
-static __inline__ void cheetah_flush_itlb_all(void)
-{
- __asm__ __volatile__("stxa %%g0, [%0] %1\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (0x80), "i" (ASI_IMMU_DEMAP));
-}
-
-/* Cheetah has a 4-tlb layout so direct access is a bit different.
- * The first two TLBs are fully assosciative, hold 16 entries, and are
- * used only for locked and >8K sized translations. One exists for
- * data accesses and one for instruction accesses.
- *
- * The third TLB is for data accesses to 8K non-locked translations, is
- * 2 way assosciative, and holds 512 entries. The fourth TLB is for
- * instruction accesses to 8K non-locked translations, is 2 way
- * assosciative, and holds 128 entries.
- *
- * Cheetah has some bug where bogus data can be returned from
- * ASI_{D,I}TLB_DATA_ACCESS loads, doing the load twice fixes
- * the problem for me. -DaveM
- */
-static __inline__ unsigned long cheetah_get_ldtlb_data(int entry)
-{
- unsigned long data;
-
- __asm__ __volatile__("ldxa [%1] %2, %%g0\n\t"
- "ldxa [%1] %2, %0"
- : "=r" (data)
- : "r" ((0 << 16) | (entry << 3)),
- "i" (ASI_DTLB_DATA_ACCESS));
-
- return data;
-}
-
-static __inline__ unsigned long cheetah_get_litlb_data(int entry)
-{
- unsigned long data;
-
- __asm__ __volatile__("ldxa [%1] %2, %%g0\n\t"
- "ldxa [%1] %2, %0"
- : "=r" (data)
- : "r" ((0 << 16) | (entry << 3)),
- "i" (ASI_ITLB_DATA_ACCESS));
-
- return data;
-}
-
-static __inline__ unsigned long cheetah_get_ldtlb_tag(int entry)
-{
- unsigned long tag;
-
- __asm__ __volatile__("ldxa [%1] %2, %0"
- : "=r" (tag)
- : "r" ((0 << 16) | (entry << 3)),
- "i" (ASI_DTLB_TAG_READ));
-
- return tag;
-}
-
-static __inline__ unsigned long cheetah_get_litlb_tag(int entry)
-{
- unsigned long tag;
-
- __asm__ __volatile__("ldxa [%1] %2, %0"
- : "=r" (tag)
- : "r" ((0 << 16) | (entry << 3)),
- "i" (ASI_ITLB_TAG_READ));
-
- return tag;
-}
-
-static __inline__ void cheetah_put_ldtlb_data(int entry, unsigned long data)
-{
- __asm__ __volatile__("stxa %0, [%1] %2\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (data),
- "r" ((0 << 16) | (entry << 3)),
- "i" (ASI_DTLB_DATA_ACCESS));
-}
-
-static __inline__ void cheetah_put_litlb_data(int entry, unsigned long data)
-{
- __asm__ __volatile__("stxa %0, [%1] %2\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (data),
- "r" ((0 << 16) | (entry << 3)),
- "i" (ASI_ITLB_DATA_ACCESS));
-}
-
-static __inline__ unsigned long cheetah_get_dtlb_data(int entry, int tlb)
-{
- unsigned long data;
-
- __asm__ __volatile__("ldxa [%1] %2, %%g0\n\t"
- "ldxa [%1] %2, %0"
- : "=r" (data)
- : "r" ((tlb << 16) | (entry << 3)), "i" (ASI_DTLB_DATA_ACCESS));
-
- return data;
-}
-
-static __inline__ unsigned long cheetah_get_dtlb_tag(int entry, int tlb)
-{
- unsigned long tag;
-
- __asm__ __volatile__("ldxa [%1] %2, %0"
- : "=r" (tag)
- : "r" ((tlb << 16) | (entry << 3)), "i" (ASI_DTLB_TAG_READ));
- return tag;
-}
-
-static __inline__ void cheetah_put_dtlb_data(int entry, unsigned long data, int tlb)
-{
- __asm__ __volatile__("stxa %0, [%1] %2\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (data),
- "r" ((tlb << 16) | (entry << 3)),
- "i" (ASI_DTLB_DATA_ACCESS));
-}
-
-static __inline__ unsigned long cheetah_get_itlb_data(int entry)
-{
- unsigned long data;
-
- __asm__ __volatile__("ldxa [%1] %2, %%g0\n\t"
- "ldxa [%1] %2, %0"
- : "=r" (data)
- : "r" ((2 << 16) | (entry << 3)),
- "i" (ASI_ITLB_DATA_ACCESS));
-
- return data;
-}
-
-static __inline__ unsigned long cheetah_get_itlb_tag(int entry)
-{
- unsigned long tag;
-
- __asm__ __volatile__("ldxa [%1] %2, %0"
- : "=r" (tag)
- : "r" ((2 << 16) | (entry << 3)), "i" (ASI_ITLB_TAG_READ));
- return tag;
-}
-
-static __inline__ void cheetah_put_itlb_data(int entry, unsigned long data)
-{
- __asm__ __volatile__("stxa %0, [%1] %2\n\t"
- "membar #Sync"
- : /* No outputs */
- : "r" (data), "r" ((2 << 16) | (entry << 3)),
- "i" (ASI_ITLB_DATA_ACCESS));
-}
-
-#endif /* !(__ASSEMBLY__) */
-
-#endif /* !(_SPARC64_SPITFIRE_H) */
diff --git a/qemu/roms/openbios/arch/sparc64/switch.S b/qemu/roms/openbios/arch/sparc64/switch.S
deleted file mode 100644
index d2cc7bedb..000000000
--- a/qemu/roms/openbios/arch/sparc64/switch.S
+++ /dev/null
@@ -1,124 +0,0 @@
-#include "pstate.h"
-#include <asm/asi.h>
-#define ASI_BP ASI_M_BYPASS
-#define REGWIN_SZ 0x40
-
- .globl __switch_context, __switch_context_nosave, __exit_context, halt
-
- .text
- .align 4
- .register %g2, #scratch
- .register %g3, #scratch
- .register %g6, #scratch
- .register %g7, #scratch
-
-/*
- * Switch execution context
- * This saves registers in the stack, then
- * switches the stack, and restores everything from the new stack.
- * This function takes no argument. New stack pointer is
- * taken from global variable __context, and old stack pointer
- * is also saved to __context. This way we can just jump to
- * this routine to get back to the original context.
- */
-
-/* XXX: totally bogus for sparc, need to save and restore all windows */
-__switch_context:
-
- /* make sure caller's windows are on caller's stack */
- flushw;
-
- /* Save everything in current stack */
-
- setx __context, %g2, %g1
- stx %g3, [%g1 + 24]
- stx %g4, [%g1 + 32]
- stx %g5, [%g1 + 40]
- stx %g6, [%g1 + 48]
- stx %g7, [%g1 + 56]
-
- stx %o0, [%g1 + 64]
- stx %o1, [%g1 + 72]
- stx %o2, [%g1 + 80]
- stx %o3, [%g1 + 88]
- stx %o4, [%g1 + 96]
- stx %o5, [%g1 + 104]
- stx %o6, [%g1 + 112]
- stx %o7, [%g1 + 120]
-
- stx %l0, [%g1 + 128]
- stx %l1, [%g1 + 136]
- stx %l2, [%g1 + 144]
- stx %l3, [%g1 + 152]
- stx %l4, [%g1 + 160]
- stx %l5, [%g1 + 168]
- stx %l6, [%g1 + 176]
- stx %l7, [%g1 + 184]
-
- stx %i0, [%g1 + 192]
- stx %i1, [%g1 + 200]
- stx %i2, [%g1 + 208]
- stx %i3, [%g1 + 216]
- stx %i4, [%g1 + 224]
- stx %i5, [%g1 + 232]
- stx %i6, [%g1 + 240]
- stx %i7, [%g1 + 248]
-
-__switch_context_nosave:
- /* Interrupts are not allowed... */
- /* make sure caller's windows are on caller's stack */
- flushw
- /* Load all registers
- */
- setx __context, %g2, %g1
- ldx [%g1], %g1
- ldx [%g1 + 16], %g2
- ldx [%g1 + 24], %g3
- ldx [%g1 + 32], %g4
- ldx [%g1 + 40], %g5
- ldx [%g1 + 48], %g6
- ldx [%g1 + 56], %g7
-
- ldx [%g1 + 64], %o0
- ldx [%g1 + 72], %o1
- ldx [%g1 + 80], %o2
- ldx [%g1 + 88], %o3
- ldx [%g1 + 96], %o4
- ldx [%g1 + 104], %o5
- ldx [%g1 + 112], %o6
- ldx [%g1 + 120], %o7
-
- ldx [%g1 + 128], %l0
- ldx [%g1 + 136], %l1
- ldx [%g1 + 144], %l2
- ldx [%g1 + 152], %l3
- ldx [%g1 + 160], %l4
- ldx [%g1 + 168], %l5
- ldx [%g1 + 176], %l6
- ldx [%g1 + 184], %l7
-
- ldx [%g1 + 192], %i0
- ldx [%g1 + 200], %i1
- ldx [%g1 + 208], %i2
- ldx [%g1 + 216], %i3
- ldx [%g1 + 224], %i4
- ldx [%g1 + 232], %i5
- ldx [%g1 + 240], %i6
- ldx [%g1 + 248], %i7
-
- ldx [%g1 + 256], %g1
- /* Finally, load new %pc */
- jmp %g1
- clr %g1
-
-__exit_context:
- /* Get back to the original context */
- call __switch_context
- nop
-
- /* We get here if the other context attempt to switch to this
- * dead context. This should not happen. */
-
-halt:
- b halt
- nop
diff --git a/qemu/roms/openbios/arch/sparc64/sys_info.c b/qemu/roms/openbios/arch/sparc64/sys_info.c
deleted file mode 100644
index f70aa0270..000000000
--- a/qemu/roms/openbios/arch/sparc64/sys_info.c
+++ /dev/null
@@ -1,59 +0,0 @@
-#include "config.h"
-#include "kernel/kernel.h"
-#include "arch/common/elf_boot.h"
-#include "libopenbios/sys_info.h"
-#include "context.h"
-#include "boot.h"
-
-#define printf printk
-#ifdef CONFIG_DEBUG_BOOT
-#define debug printk
-#else
-#define debug(x...)
-#endif
-
-uint64_t qemu_mem_size;
-unsigned long va_shift;
-
-void collect_multiboot_info(struct sys_info *);
-
-void collect_sys_info(struct sys_info *info)
-{
- int i;
- unsigned long long total = 0;
- struct memrange *mmap;
-
- /* Pick up paramters given by bootloader to us */
- //info->boot_type = boot_ctx->eax;
- //info->boot_data = boot_ctx->ebx;
- info->boot_arg = boot_ctx->param[0];
- //debug("boot eax = %#lx\n", info->boot_type);
- //debug("boot ebx = %#lx\n", info->boot_data);
- info->boot_type = ELF_BHDR_MAGIC;
- info->boot_data = virt_to_phys(&elf_image_notes);
- debug("boot arg = %#lx\n", info->boot_arg);
-
- collect_elfboot_info(info);
-#ifdef CONFIG_LINUXBIOS
- collect_linuxbios_info(info);
-#endif
-#ifdef CONFIG_IMAGE_ELF_MULTIBOOT
- collect_multiboot_info(info);
-#endif
-
- if (!info->memrange) {
- info->n_memranges = 1;
- info->memrange = malloc(1 * sizeof(struct memrange));
- info->memrange[0].base = 0;
- info->memrange[0].size = qemu_mem_size;
- }
-
- debug("\n");
- mmap=info->memrange;
- for (i = 0; i < info->n_memranges; i++) {
- debug("%08lx-", (long)mmap[i].base);
- debug("%08lx\n", (long)mmap[i].base + (long)mmap[i].size);
- total += mmap[i].size;
- }
- debug("RAM %ld MB\n", (long)total >> 20);
-}
diff --git a/qemu/roms/openbios/arch/sparc64/tree.fs b/qemu/roms/openbios/arch/sparc64/tree.fs
deleted file mode 100644
index e034b5931..000000000
--- a/qemu/roms/openbios/arch/sparc64/tree.fs
+++ /dev/null
@@ -1,49 +0,0 @@
-include config.fs
-
-\ -------------------------------------------------------------------------
-\ UPA encode/decode unit
-\ -------------------------------------------------------------------------
-
-: decode-unit-upa ( str len -- id lun )
- ascii , left-split
- ( addr-R len-R addr-L len-L )
- parse-hex
- -rot parse-hex
- swap
-;
-
-: encode-unit-upa ( id lun -- str len)
- swap
- pocket tohexstr
- " ," pocket tmpstrcat >r
- rot pocket tohexstr r> tmpstrcat drop
-;
-
-" /" find-device
- 2 encode-int " #address-cells" property
- 2 encode-int " #size-cells" property
- " sun4u" encode-string " compatible" property
-
- : encode-unit encode-unit-upa ;
- : decode-unit decode-unit-upa ;
-
-new-device
- " memory" device-name
- " memory" device-type
- external
- : open true ;
- : close ;
- \ see arch/sparc64/lib.c for methods
-finish-device
-
-new-device
- " virtual-memory" device-name
- external
- \ see arch/sparc64/lib.c for methods
-finish-device
-
-" /options" find-device
- " disk" encode-string " boot-from" property
-
-" /openprom" find-device
- " OBP 3.10.24 1999/01/01 01:01" encode-string " version" property
diff --git a/qemu/roms/openbios/arch/sparc64/vectors.S b/qemu/roms/openbios/arch/sparc64/vectors.S
deleted file mode 100644
index 9d86b6bd8..000000000
--- a/qemu/roms/openbios/arch/sparc64/vectors.S
+++ /dev/null
@@ -1,591 +0,0 @@
-/*
- * <vectors.S>
- *
- * Sparc V9 Trap Table(s) with SpitFire/Cheetah extensions.
- *
- * Copyright (C) 1996, 2001 David S. Miller (davem@caip.rutgers.edu)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301, USA.
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License V2
- * as published by the Free Software Foundation
- */
-
-#define __ASSEMBLY__
-#include "cpustate.h"
-#include "pstate.h"
-#include <asm/asi.h>
-#define ASI_BP ASI_PHYS_BYPASS_EC_E
-#define PROM_ADDR 0x1fff0000000
-#define SER_ADDR 0x1fe020003f8
-#define TICK_INT_DIS 0x8000000000000000
-#define TICK_INTERVAL 1*1000*1000
-
- .section ".text.vectors", "ax"
- .align 16384
-/* Sparc64 trap table */
- .globl trap_table, __divide_error, softint_irq, softint_irq_tl1
- .register %g2, #scratch
- .register %g3, #scratch
- .register %g6, #scratch
- .register %g7, #scratch
-trap_table:
-#define SPILL_WINDOW \
- btst 1, %sp; \
- be spill_32bit; \
- nop; \
- stx %l0, [%sp + STACK_BIAS + 0x00]; \
- stx %l1, [%sp + STACK_BIAS + 0x08]; \
- stx %l2, [%sp + STACK_BIAS + 0x10]; \
- stx %l3, [%sp + STACK_BIAS + 0x18]; \
- stx %l4, [%sp + STACK_BIAS + 0x20]; \
- stx %l5, [%sp + STACK_BIAS + 0x28]; \
- stx %l6, [%sp + STACK_BIAS + 0x30]; \
- stx %l7, [%sp + STACK_BIAS + 0x38]; \
- stx %i0, [%sp + STACK_BIAS + 0x40]; \
- stx %i1, [%sp + STACK_BIAS + 0x48]; \
- stx %i2, [%sp + STACK_BIAS + 0x50]; \
- stx %i3, [%sp + STACK_BIAS + 0x58]; \
- stx %i4, [%sp + STACK_BIAS + 0x60]; \
- stx %i5, [%sp + STACK_BIAS + 0x68]; \
- stx %i6, [%sp + STACK_BIAS + 0x70]; \
- stx %i7, [%sp + STACK_BIAS + 0x78]; \
- saved; retry; nop; nop; nop; nop; nop; nop; \
- nop; nop; nop; nop; nop;
-
-#define FILL_WINDOW \
- btst 1, %sp; \
- be fill_32bit; \
- nop; \
- ldx [%sp + STACK_BIAS + 0x00], %l0; \
- ldx [%sp + STACK_BIAS + 0x08], %l1; \
- ldx [%sp + STACK_BIAS + 0x10], %l2; \
- ldx [%sp + STACK_BIAS + 0x18], %l3; \
- ldx [%sp + STACK_BIAS + 0x20], %l4; \
- ldx [%sp + STACK_BIAS + 0x28], %l5; \
- ldx [%sp + STACK_BIAS + 0x30], %l6; \
- ldx [%sp + STACK_BIAS + 0x38], %l7; \
- ldx [%sp + STACK_BIAS + 0x40], %i0; \
- ldx [%sp + STACK_BIAS + 0x48], %i1; \
- ldx [%sp + STACK_BIAS + 0x50], %i2; \
- ldx [%sp + STACK_BIAS + 0x58], %i3; \
- ldx [%sp + STACK_BIAS + 0x60], %i4; \
- ldx [%sp + STACK_BIAS + 0x68], %i5; \
- ldx [%sp + STACK_BIAS + 0x70], %i6; \
- ldx [%sp + STACK_BIAS + 0x78], %i7; \
- restored; retry; nop; nop; nop; nop; nop; nop; \
- nop; nop; nop; nop; nop;
-
-#define CLEAN_WINDOW \
- rdpr %cleanwin, %l0; add %l0, 1, %l0; \
- wrpr %l0, 0x0, %cleanwin; \
- clr %o0; clr %o1; clr %o2; clr %o3; \
- clr %o4; clr %o5; clr %o6; clr %o7; \
- clr %l0; clr %l1; clr %l2; clr %l3; \
- clr %l4; clr %l5; clr %l6; clr %l7; \
- retry; \
- nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;
-
-#define TRAP_IRQ(routine, level) \
- ba routine; mov level, %g1; nop; nop; nop; nop; nop; nop;
-#define BTRAP(lvl) \
- ba bug; mov lvl, %g1; nop; nop; nop; nop; nop; nop;
-#define BTRAPTL1(lvl) BTRAP(lvl)
-#define BTRAPS(x) BTRAP(x) BTRAP(x+1) BTRAP(x+2) BTRAP(x+3) BTRAP(x+4) BTRAP(x+5) BTRAP(x+6) BTRAP(x+7)
-#define BTRAPS4(x) BTRAP(x) BTRAP(x+1) BTRAP(x+2) BTRAP(x+3)
-#define TRAP_HANDLER(routine) ba routine; nop; nop; nop; nop; nop; nop; nop;
-
-#define STACK_BIAS 2047
- .globl sparc64_ttable_tl0, sparc64_ttable_tl1
-sparc64_ttable_tl0:
- ba entry; nop; nop; nop; nop; nop; nop; nop;! XXX remove
- ba entry; nop; nop; nop; nop; nop; nop; nop;! Power-on reset
- ba entry; nop; nop; nop; nop; nop; nop; nop;! Watchdog reset
- ba entry; nop; nop; nop; nop; nop; nop; nop;! External reset
- ba entry; nop; nop; nop; nop; nop; nop; nop;! Software reset
- ba entry; nop; nop; nop; nop; nop; nop; nop;! RED state
- BTRAP(0x06) BTRAP(0x07) BTRAPS(0x08)
- BTRAPS(0x10) BTRAPS(0x18)
- BTRAP(0x20) BTRAP(0x21) BTRAP(0x22) BTRAP(0x23)
- CLEAN_WINDOW ! 24-27
- BTRAPS(0x28)
- BTRAPS(0x30) BTRAPS(0x38)
- BTRAP(0x40) BTRAP(0x41) BTRAP(0x42) BTRAP(0x43)
-tl0_irq4: TRAP_IRQ(handler_irq, 4)
-tl0_irq5: TRAP_IRQ(handler_irq, 5) TRAP_IRQ(handler_irq, 6)
-tl0_irq7: TRAP_IRQ(handler_irq, 7) TRAP_IRQ(handler_irq, 8)
-tl0_irq9: TRAP_IRQ(handler_irq, 9) TRAP_IRQ(handler_irq, 10)
-tl0_irq11: TRAP_IRQ(handler_irq, 11) TRAP_IRQ(handler_irq, 12)
-tl0_irq13: TRAP_IRQ(handler_irq, 13)
-tl0_irq14: TRAP_IRQ(softint_irq, 14)
-tl0_irq15: TRAP_IRQ(handler_irq, 15)
- BTRAPS(0x50) BTRAPS(0x58)
- BTRAPS4(0x60)
- TRAP_HANDLER(reload_IMMU_tlb) ! 0x64 : instruction_access_MMU_miss
- TRAP_HANDLER(reload_IMMU_tlb) ! 0x65 : instruction_access_MMU_miss
- TRAP_HANDLER(reload_IMMU_tlb) ! 0x66 : instruction_access_MMU_miss
- TRAP_HANDLER(reload_IMMU_tlb) ! 0x67 : instruction_access_MMU_miss
- TRAP_HANDLER(reload_DMMU_tlb) ! 0x68 : data_access_MMU_miss
- TRAP_HANDLER(reload_DMMU_tlb) ! 0x69 : data_access_MMU_miss
- TRAP_HANDLER(reload_DMMU_tlb) ! 0x6A : data_access_MMU_miss
- TRAP_HANDLER(reload_DMMU_tlb) ! 0x6B : data_access_MMU_miss
- BTRAPS4(0x6C) ! data_access_protection
- BTRAPS(0x70) BTRAPS(0x78)
-tl0_s0n: SPILL_WINDOW
-tl0_s1n: SPILL_WINDOW
-tl0_s2n: SPILL_WINDOW
-tl0_s3n: SPILL_WINDOW
-tl0_s4n: SPILL_WINDOW
-tl0_s5n: SPILL_WINDOW
-tl0_s6n: SPILL_WINDOW
-tl0_s7n: SPILL_WINDOW
-tl0_s0o: SPILL_WINDOW
-tl0_s1o: SPILL_WINDOW
-tl0_s2o: SPILL_WINDOW
-tl0_s3o: SPILL_WINDOW
-tl0_s4o: SPILL_WINDOW
-tl0_s5o: SPILL_WINDOW
-tl0_s6o: SPILL_WINDOW
-tl0_s7o: SPILL_WINDOW
-tl0_f0n: FILL_WINDOW
-tl0_f1n: FILL_WINDOW
-tl0_f2n: FILL_WINDOW
-tl0_f3n: FILL_WINDOW
-tl0_f4n: FILL_WINDOW
-tl0_f5n: FILL_WINDOW
-tl0_f6n: FILL_WINDOW
-tl0_f7n: FILL_WINDOW
-tl0_f0o: FILL_WINDOW
-tl0_f1o: FILL_WINDOW
-tl0_f2o: FILL_WINDOW
-tl0_f3o: FILL_WINDOW
-tl0_f4o: FILL_WINDOW
-tl0_f5o: FILL_WINDOW
-tl0_f6o: FILL_WINDOW
-tl0_f7o: FILL_WINDOW
-tl0_resv100: BTRAPS(0x100) BTRAPS(0x108)
-tl0_resv110: BTRAPS(0x110) BTRAPS(0x118)
-tl0_resv120: BTRAPS(0x120) BTRAPS(0x128)
-tl0_resv130: BTRAPS(0x130) BTRAPS(0x138)
-tl0_resv140: BTRAPS(0x140) BTRAPS(0x148)
-tl0_resv150: BTRAPS(0x150) BTRAPS(0x158)
-tl0_resv160: BTRAPS(0x160) BTRAPS(0x168)
-tl0_resv170: BTRAPS(0x170) BTRAPS(0x178)
-tl0_resv180: BTRAPS(0x180) BTRAPS(0x188)
-tl0_resv190: BTRAPS(0x190) BTRAPS(0x198)
-tl0_resv1a0: BTRAPS(0x1a0) BTRAPS(0x1a8)
-tl0_resv1b0: BTRAPS(0x1b0) BTRAPS(0x1b8)
-tl0_resv1c0: BTRAPS(0x1c0) BTRAPS(0x1c8)
-tl0_resv1d0: BTRAPS(0x1d0) BTRAPS(0x1d8)
-tl0_resv1e0: BTRAPS(0x1e0) BTRAPS(0x1e8)
-tl0_resv1f0: BTRAPS(0x1f0) BTRAPS(0x1f8)
-
-#undef BTRAPS
-#define BTRAPS(x) BTRAPTL1(x) BTRAPTL1(x+1) BTRAPTL1(x+2) BTRAPTL1(x+3) BTRAPTL1(x+4) BTRAPTL1(x+5) BTRAPTL1(x+6) BTRAPTL1(x+7)
-
-#define SKIP_IRQ(routine, level) \
- retry; nop; nop; nop; nop; nop; nop; nop;
-
-sparc64_ttable_tl1:
- BTRAPS(0x00) BTRAPS(0x08)
- BTRAPS(0x10) BTRAPS(0x18)
- BTRAPTL1(0x20) BTRAPTL1(0x21) BTRAPTL1(0x22) BTRAPTL1(0x23)
- CLEAN_WINDOW ! 24-27
- BTRAPS(0x28)
- BTRAPS(0x30) BTRAPS(0x38)
- BTRAPTL1(0x40) BTRAPTL1(0x41) BTRAPTL1(0x42) BTRAPTL1(0x43)
-tl1_irq4: TRAP_IRQ(handler_irq, 4)
-tl1_irq5: TRAP_IRQ(handler_irq, 5) TRAP_IRQ(handler_irq, 6)
-tl1_irq7: TRAP_IRQ(handler_irq, 7) TRAP_IRQ(handler_irq, 8)
-tl1_irq9: TRAP_IRQ(handler_irq, 9) TRAP_IRQ(handler_irq, 10)
-tl1_irq11: TRAP_IRQ(handler_irq, 11) TRAP_IRQ(handler_irq, 12)
-tl1_irq13: TRAP_IRQ(handler_irq, 13)
-tl1_irq14: SKIP_IRQ(softint_irq, 14)
-tl1_irq15: TRAP_IRQ(handler_irq, 15)
- BTRAPS(0x50) BTRAPS(0x58)
- BTRAPS4(0x60)
- TRAP_HANDLER(reload_IMMU_tlb) ! 0x64 : instruction_access_MMU_miss
- TRAP_HANDLER(reload_IMMU_tlb) ! 0x65 : instruction_access_MMU_miss
- TRAP_HANDLER(reload_IMMU_tlb) ! 0x66 : instruction_access_MMU_miss
- TRAP_HANDLER(reload_IMMU_tlb) ! 0x67 : instruction_access_MMU_miss
- TRAP_HANDLER(reload_DMMU_tlb) ! 0x68 : data_access_MMU_miss
- TRAP_HANDLER(reload_DMMU_tlb) ! 0x69 : data_access_MMU_miss
- TRAP_HANDLER(reload_DMMU_tlb) ! 0x6A : data_access_MMU_miss
- TRAP_HANDLER(reload_DMMU_tlb) ! 0x6B : data_access_MMU_miss
- BTRAPS4(0x6C) ! data_access_protection
- BTRAPS(0x70) BTRAPS(0x78)
-tl1_s0n: SPILL_WINDOW
-tl1_s1n: SPILL_WINDOW
-tl1_s2n: SPILL_WINDOW
-tl1_s3n: SPILL_WINDOW
-tl1_s4n: SPILL_WINDOW
-tl1_s5n: SPILL_WINDOW
-tl1_s6n: SPILL_WINDOW
-tl1_s7n: SPILL_WINDOW
-tl1_s0o: SPILL_WINDOW
-tl1_s1o: SPILL_WINDOW
-tl1_s2o: SPILL_WINDOW
-tl1_s3o: SPILL_WINDOW
-tl1_s4o: SPILL_WINDOW
-tl1_s5o: SPILL_WINDOW
-tl1_s6o: SPILL_WINDOW
-tl1_s7o: SPILL_WINDOW
-tl1_f0n: FILL_WINDOW
-tl1_f1n: FILL_WINDOW
-tl1_f2n: FILL_WINDOW
-tl1_f3n: FILL_WINDOW
-tl1_f4n: FILL_WINDOW
-tl1_f5n: FILL_WINDOW
-tl1_f6n: FILL_WINDOW
-tl1_f7n: FILL_WINDOW
-tl1_f0o: FILL_WINDOW
-tl1_f1o: FILL_WINDOW
-tl1_f2o: FILL_WINDOW
-tl1_f3o: FILL_WINDOW
-tl1_f4o: FILL_WINDOW
-tl1_f5o: FILL_WINDOW
-tl1_f6o: FILL_WINDOW
-tl1_f7o: FILL_WINDOW
-tl1_resv100: BTRAPS(0x100) BTRAPS(0x108)
-tl1_resv110: BTRAPS(0x110) BTRAPS(0x118)
-tl1_resv120: BTRAPS(0x120) BTRAPS(0x128)
-tl1_resv130: BTRAPS(0x130) BTRAPS(0x138)
-tl1_resv140: BTRAPS(0x140) BTRAPS(0x148)
-tl1_resv150: BTRAPS(0x150) BTRAPS(0x158)
-tl1_resv160: BTRAPS(0x160) BTRAPS(0x168)
-tl1_resv170: BTRAPS(0x170) BTRAPS(0x178)
-tl1_resv180: BTRAPS(0x180) BTRAPS(0x188)
-tl1_resv190: BTRAPS(0x190) BTRAPS(0x198)
-tl1_resv1a0: BTRAPS(0x1a0) BTRAPS(0x1a8)
-tl1_resv1b0: BTRAPS(0x1b0) BTRAPS(0x1b8)
-tl1_resv1c0: BTRAPS(0x1c0) BTRAPS(0x1c8)
-tl1_resv1d0: BTRAPS(0x1d0) BTRAPS(0x1d8)
-tl1_resv1e0: BTRAPS(0x1e0) BTRAPS(0x1e8)
-tl1_resv1f0: BTRAPS(0x1f0) BTRAPS(0x1f8)
-
- .section ".data"
- .align 8
- .globl obp_ticks_pointer
-
-
- ! Pointer to current tick value
-obp_ticks_pointer:
- .xword 0
-
- .section ".text", "ax"
-
-spill_32bit:
- srl %sp, 0, %sp
- stw %l0, [%sp + 0x00]
- stw %l1, [%sp + 0x04]
- stw %l2, [%sp + 0x08]
- stw %l3, [%sp + 0x0c]
- stw %l4, [%sp + 0x10]
- stw %l5, [%sp + 0x14]
- stw %l6, [%sp + 0x18]
- stw %l7, [%sp + 0x1c]
- stw %i0, [%sp + 0x20]
- stw %i1, [%sp + 0x24]
- stw %i2, [%sp + 0x28]
- stw %i3, [%sp + 0x2c]
- stw %i4, [%sp + 0x30]
- stw %i5, [%sp + 0x34]
- stw %i6, [%sp + 0x38]
- stw %i7, [%sp + 0x3c]
- saved
- retry
-
-fill_32bit:
- srl %sp, 0, %sp
- lduw [%sp + 0x00], %l0
- lduw [%sp + 0x04], %l1
- lduw [%sp + 0x08], %l2
- lduw [%sp + 0x0c], %l3
- lduw [%sp + 0x10], %l4
- lduw [%sp + 0x14], %l5
- lduw [%sp + 0x18], %l6
- lduw [%sp + 0x1c], %l7
- lduw [%sp + 0x20], %i0
- lduw [%sp + 0x24], %i1
- lduw [%sp + 0x28], %i2
- lduw [%sp + 0x2c], %i3
- lduw [%sp + 0x30], %i4
- lduw [%sp + 0x34], %i5
- lduw [%sp + 0x38], %i6
- lduw [%sp + 0x3c], %i7
- restored
- retry
-
-
- .globl reload_DMMU_tlb, reload_IMMU_tlb, bug
-
-reload_DMMU_tlb:
-
- /* Save CPU state to stack */
- setx _fcstack_ptr, %g6, %g7
- ldx [%g7], %g1
- add %g1, -CONTEXT_STATE_SIZE, %g1
- stx %g1, [%g7]
-
- SAVE_CPU_STATE(dtlb)
-
- /* Switch to 8K TLB locked OpenBIOS stack (note we add an additional 192 bytes required for
- gcc to save its arguments when building with -O0) */
- setx _fcstack_ptr, %g6, %g7
- ldx [%g7], %g6
- setx CONTEXT_STACK_SIZE, %g4, %g5
- sub %g6, %g5, %g6
- stx %g6, [%g7]
-
- setx - 2047 - 192, %g6, %g7
- add %g1, %g7, %g7
- mov %g7, %sp
-
- /* Enable interrupts for window spill/fill traps */
- rdpr %pstate, %g7
- or %g7, PSTATE_IE, %g7
- wrpr %g7, %pstate
-
- call dtlb_miss_handler
- nop
-
- /* Disable interrupts */
- rdpr %pstate, %g7
- andn %g7, PSTATE_IE, %g7
- wrpr %g7, %pstate
-
- /* Restore CPU state from stack */
- setx _fcstack_ptr, %g6, %g7
- ldx [%g7], %g1
- setx CONTEXT_STACK_SIZE, %g4, %g5
- add %g1, %g5, %g1
- stx %g1, [%g7]
-
- RESTORE_CPU_STATE(dtlb)
-
- setx _fcstack_ptr, %g6, %g7
- ldx [%g7], %g1
- add %g1, CONTEXT_STATE_SIZE, %g1
- stx %g1, [%g7]
-
- retry
-
-reload_IMMU_tlb:
-
- /* Save CPU state to stack */
- setx _fcstack_ptr, %g6, %g7
- ldx [%g7], %g1
- add %g1, -CONTEXT_STATE_SIZE, %g1
- stx %g1, [%g7]
-
- SAVE_CPU_STATE(itlb)
-
- /* Switch to 8K TLB locked OpenBIOS stack (note we add an additional 192 bytes required for
- gcc to save its arguments when building with -O0) */
- setx _fcstack_ptr, %g6, %g7
- ldx [%g7], %g6
- setx CONTEXT_STACK_SIZE, %g4, %g5
- sub %g6, %g5, %g6
- stx %g6, [%g7]
-
- setx - 2047 - 192, %g6, %g7
- add %g1, %g7, %g7
- mov %g7, %sp
-
- /* Enable interrupts for window spill/fill traps */
- rdpr %pstate, %g7
- or %g7, PSTATE_IE, %g7
- wrpr %g7, %pstate
-
- call itlb_miss_handler
- nop
-
- /* Disable interrupts */
- rdpr %pstate, %g7
- andn %g7, PSTATE_IE, %g7
- wrpr %g7, %pstate
-
- /* Restore CPU state from stack */
- setx _fcstack_ptr, %g6, %g7
- ldx [%g7], %g1
- setx CONTEXT_STACK_SIZE, %g4, %g5
- add %g1, %g5, %g1
- stx %g1, [%g7]
-
- RESTORE_CPU_STATE(itlb)
-
- setx _fcstack_ptr, %g6, %g7
- ldx [%g7], %g1
- add %g1, CONTEXT_STATE_SIZE, %g1
- stx %g1, [%g7]
-
- retry
-
-softint_irq_tl1:
-softint_irq:
- mov 1, %g2
- /* clear tick interrupt */
- wr %g2, 0x0, %clear_softint
- sll %g2, %g1, %g2
- sra %g2, 0, %g2
- /* clear softint interrupt */
- wr %g2, 0x0, %clear_softint
-
- setx TICK_INT_DIS, %g2, %g1
- rd %tick, %g2
- and %g1, %g2, %g1
- brnz,pn %g1, tick_compare_disabled
- nop
-
- /* update tick value if pointer set */
- setx obp_ticks_pointer, %g3, %g1
- ldx [%g1], %g3
- brz %g3, tick_rearm
- nop
-
- ldx [%g3], %g1
- add %g1, 10, %g1 ! 100Hz = 10ms
- stx %g1, [%g3]
-
-tick_rearm:
- set TICK_INTERVAL, %g1
- add %g1, %g2, %g1
- wr %g1, 0, %tick_cmpr
-tick_compare_disabled:
- retry
-
-handler_irq:
-__divide_error:
-bug:
- /* Dump the exception and its context */
- ! Set up CPU state
- ! Don't change the global register set or we lose %g1 (exception level)
- rdpr %pstate, %g2
- or %g2, PSTATE_PRIV, %g2
- wrpr %g2, %pstate
- wr %g0, 0, %fprs
-
- ! Jump to ROM ...
- setx _start, %g2, %g3
- setx highmem, %g2, %g4
- sub %g4, %g3, %g4
- setx PROM_ADDR, %g2, %g3
- add %g4, %g3, %g3
- jmp %g3
- ! ... while disabling I/D MMUs and caches
- stxa %g0, [%g0] ASI_LSU_CONTROL
-
-highmem:
- ! Extract NWINDOWS from %ver
- rdpr %ver, %g2
- and %g2, 0xf, %g2
- wrpr %g2, 0, %cleanwin
- wrpr %g2, 0, %cansave
- wrpr %g0, 0, %canrestore
- wrpr %g0, 0, %otherwin
- wrpr %g0, 0, %wstate
-
- b dump_exception
- nop
-
-outstr:
- /* void outstr (unsigned long port, const unsigned char *str);
- * Writes a string on an IO port.
- */
-1: ldub [%o1], %o3
- cmp %o3, 0
- be 2f
- nop
- stba %o3, [%o0] ASI_BP
- b 1b
- inc %o1
-2: retl
- nop
-
-outdigit:
- /* void outdigit (unsigned long port, uint8_t digit);
- * Dumps a single digit on serial port.
- */
- add %o1, '0', %o1
- retl
- stba %o1, [%o0] ASI_BP
-
-outhex:
- /* void outhex (unsigned long port, uint64_t value);
- * Dumps a 64 bits hex number on serial port
- */
- mov %o1, %o2
- set 60, %o3
- srlx %o2, %o3, %o1
-1: and %o1, 0xf, %o1
- cmp %o1, 9
- bgt 2f
- nop
- b 3f
- add %o1, '0', %o1
-2: add %o1, 'a' - 10, %o1
-3: stba %o1, [%o0] ASI_BP
- subcc %o3, 4, %o3
- bge 1b
- srlx %o2, %o3, %o1
- retl
- nop
-
- /* void dump_exception ();
- *
- * Dump a message when catching an exception
- */
-dump_exception:
- setx SER_ADDR, %o3, %o0
- set _start, %g3
- set (_BUG_message_0), %o1
- sub %o1, %g3, %g4
- setx PROM_ADDR, %g2, %g3
- add %g4, %g3, %g3
- call outstr
- mov %g3, %o1
-
- call outhex
- mov %g1, %o1
-
- call outstr
- add %g3, (_BUG_message_1 - _BUG_message_0), %o1
-
- call outhex
- rdpr %tpc, %o1
-
- call outstr
- add %g3, (_BUG_message_2 - _BUG_message_0), %o1
-
- call outhex
- rdpr %tnpc, %o1
-
- call outstr
- add %g3, (_BUG_message_3 - _BUG_message_0), %o1
-
-_forever:
- /* Loop forever */
- b _forever ;
- nop
-
- .section .rodata
-_BUG_message_0:
- .string "Unhandled Exception 0x"
-_BUG_message_1:
- .string "\nPC = 0x"
-_BUG_message_2:
- .string " NPC = 0x"
-_BUG_message_3:
- .string "\nStopping execution\n"