diff options
Diffstat (limited to 'qemu/roms/openbios/arch/sparc32/openbios.c')
-rw-r--r-- | qemu/roms/openbios/arch/sparc32/openbios.c | 1005 |
1 files changed, 0 insertions, 1005 deletions
diff --git a/qemu/roms/openbios/arch/sparc32/openbios.c b/qemu/roms/openbios/arch/sparc32/openbios.c deleted file mode 100644 index 6f4ee454e..000000000 --- a/qemu/roms/openbios/arch/sparc32/openbios.c +++ /dev/null @@ -1,1005 +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 "asm/types.h" -#include "dict.h" -#include "kernel/kernel.h" -#include "kernel/stack.h" -#include "arch/common/nvram.h" -#include "packages/nvram.h" -#include "../../drivers/timer.h" // XXX -#include "libopenbios/sys_info.h" -#include "openbios.h" -#include "boot.h" -#include "romvec.h" -#include "openprom.h" -#include "psr.h" -#include "libopenbios/video.h" -#define NO_QEMU_PROTOS -#include "arch/common/fw_cfg.h" -#include "arch/sparc32/ofmem_sparc32.h" - -#define MEMORY_SIZE (128*1024) /* 128K ram for hosted system */ -#define UUID_FMT "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x" -#define FW_CFG_SUN4M_DEPTH (FW_CFG_ARCH_LOCAL + 0x00) - -int qemu_machine_type; - -struct hwdef { - uint64_t iommu_base, slavio_base; - uint64_t intctl_base, counter_base, nvram_base, ms_kb_base, serial_base; - unsigned long fd_offset, counter_offset, intr_offset; - unsigned long aux1_offset, aux2_offset; - uint64_t dma_base, esp_base, le_base; - uint64_t tcx_base; - int intr_ncpu; - int mid_offset; - int machine_id_low, machine_id_high; -}; - -static const struct hwdef hwdefs[] = { - /* SS-5 */ - { - .iommu_base = 0x10000000, - .tcx_base = 0x50000000, - .slavio_base = 0x71000000, - .ms_kb_base = 0x71000000, - .serial_base = 0x71100000, - .nvram_base = 0x71200000, - .fd_offset = 0x00400000, - .counter_offset = 0x00d00000, - .intr_offset = 0x00e00000, - .intr_ncpu = 1, - .aux1_offset = 0x00900000, - .aux2_offset = 0x00910000, - .dma_base = 0x78400000, - .esp_base = 0x78800000, - .le_base = 0x78c00000, - .mid_offset = 0, - .machine_id_low = 32, - .machine_id_high = 63, - }, - /* SS-10, SS-20 */ - { - .iommu_base = 0xfe0000000ULL, - .tcx_base = 0xe20000000ULL, - .slavio_base = 0xff1000000ULL, - .ms_kb_base = 0xff1000000ULL, - .serial_base = 0xff1100000ULL, - .nvram_base = 0xff1200000ULL, - .fd_offset = 0x00700000, // 0xff1700000ULL, - .counter_offset = 0x00300000, // 0xff1300000ULL, - .intr_offset = 0x00400000, // 0xff1400000ULL, - .intr_ncpu = 4, - .aux1_offset = 0x00800000, // 0xff1800000ULL, - .aux2_offset = 0x00a01000, // 0xff1a01000ULL, - .dma_base = 0xef0400000ULL, - .esp_base = 0xef0800000ULL, - .le_base = 0xef0c00000ULL, - .mid_offset = 8, - .machine_id_low = 64, - .machine_id_high = 65, - }, - /* SS-600MP */ - { - .iommu_base = 0xfe0000000ULL, - .tcx_base = 0xe20000000ULL, - .slavio_base = 0xff1000000ULL, - .ms_kb_base = 0xff1000000ULL, - .serial_base = 0xff1100000ULL, - .nvram_base = 0xff1200000ULL, - .fd_offset = -1, - .counter_offset = 0x00300000, // 0xff1300000ULL, - .intr_offset = 0x00400000, // 0xff1400000ULL, - .intr_ncpu = 4, - .aux1_offset = 0x00800000, // 0xff1800000ULL, - .aux2_offset = 0x00a01000, // 0xff1a01000ULL, XXX should not exist - .dma_base = 0xef0081000ULL, - .esp_base = 0xef0080000ULL, - .le_base = 0xef0060000ULL, - .mid_offset = 8, - .machine_id_low = 66, - .machine_id_high = 66, - }, -}; - -static const struct hwdef *hwdef; - -void setup_timers(void) -{ -} - -void udelay(unsigned int usecs) -{ -} - -void mdelay(unsigned int msecs) -{ -} - -static void mb86904_init(void) -{ - PUSH(32); - fword("encode-int"); - push_str("cache-line-size"); - fword("property"); - - PUSH(512); - fword("encode-int"); - push_str("cache-nlines"); - fword("property"); - - PUSH(0x23); - fword("encode-int"); - push_str("mask_rev"); - fword("property"); -} - -static void tms390z55_init(void) -{ - push_str(""); - fword("encode-string"); - push_str("ecache-parity?"); - fword("property"); - - push_str(""); - fword("encode-string"); - push_str("bfill?"); - fword("property"); - - push_str(""); - fword("encode-string"); - push_str("bcopy?"); - fword("property"); - - push_str(""); - fword("encode-string"); - push_str("cache-physical?"); - fword("property"); - - PUSH(0xf); - fword("encode-int"); - PUSH(0xf8fffffc); - fword("encode-int"); - fword("encode+"); - PUSH(4); - fword("encode-int"); - fword("encode+"); - - PUSH(0xf); - fword("encode-int"); - fword("encode+"); - PUSH(0xf8c00000); - fword("encode-int"); - fword("encode+"); - PUSH(0x1000); - fword("encode-int"); - fword("encode+"); - - PUSH(0xf); - fword("encode-int"); - fword("encode+"); - PUSH(0xf8000000); - fword("encode-int"); - fword("encode+"); - PUSH(0x1000); - fword("encode-int"); - fword("encode+"); - - PUSH(0xf); - fword("encode-int"); - fword("encode+"); - PUSH(0xf8800000); - fword("encode-int"); - fword("encode+"); - PUSH(0x1000); - fword("encode-int"); - fword("encode+"); - push_str("reg"); - fword("property"); -} - -static void rt625_init(void) -{ - PUSH(32); - fword("encode-int"); - push_str("cache-line-size"); - fword("property"); - - PUSH(512); - fword("encode-int"); - push_str("cache-nlines"); - fword("property"); - -} - -static void bad_cpu_init(void) -{ - printk("This CPU is not supported yet, freezing.\n"); - for(;;); -} - -struct cpudef { - unsigned long iu_version; - const char *name; - int psr_impl, psr_vers, impl, vers; - int dcache_line_size, dcache_lines, dcache_assoc; - int icache_line_size, icache_lines, icache_assoc; - int ecache_line_size, ecache_lines, ecache_assoc; - int mmu_nctx; - void (*initfn)(void); -}; - -static const struct cpudef sparc_defs[] = { - { - .iu_version = 0x00 << 24, /* Impl 0, ver 0 */ - .name = "FMI,MB86900", - .initfn = bad_cpu_init, - }, - { - .iu_version = 0x04 << 24, /* Impl 0, ver 4 */ - .name = "FMI,MB86904", - .psr_impl = 0, - .psr_vers = 4, - .impl = 0, - .vers = 4, - .dcache_line_size = 0x10, - .dcache_lines = 0x200, - .dcache_assoc = 1, - .icache_line_size = 0x20, - .icache_lines = 0x200, - .icache_assoc = 1, - .ecache_line_size = 0x20, - .ecache_lines = 0x4000, - .ecache_assoc = 1, - .mmu_nctx = 0x100, - .initfn = mb86904_init, - }, - { - .iu_version = 0x05 << 24, /* Impl 0, ver 5 */ - .name = "FMI,MB86907", - .psr_impl = 0, - .psr_vers = 5, - .impl = 0, - .vers = 5, - .dcache_line_size = 0x20, - .dcache_lines = 0x200, - .dcache_assoc = 1, - .icache_line_size = 0x20, - .icache_lines = 0x200, - .icache_assoc = 1, - .ecache_line_size = 0x20, - .ecache_lines = 0x4000, - .ecache_assoc = 1, - .mmu_nctx = 0x100, - .initfn = mb86904_init, - }, - { - .iu_version = 0x10 << 24, /* Impl 1, ver 0 */ - .name = "LSI,L64811", - .initfn = bad_cpu_init, - }, - { - .iu_version = 0x11 << 24, /* Impl 1, ver 1 */ - .name = "CY,CY7C601", - .psr_impl = 1, - .psr_vers = 1, - .impl = 1, - .vers = 1, - .mmu_nctx = 0x10, - .initfn = bad_cpu_init, - }, - { - .iu_version = 0x13 << 24, /* Impl 1, ver 3 */ - .name = "CY,CY7C611", - .initfn = bad_cpu_init, - }, - { - .iu_version = 0x40000000, - .name = "TI,TMS390Z55", - .psr_impl = 4, - .psr_vers = 0, - .impl = 0, - .vers = 4, - .dcache_line_size = 0x20, - .dcache_lines = 0x80, - .dcache_assoc = 4, - .icache_line_size = 0x40, - .icache_lines = 0x40, - .icache_assoc = 5, - .ecache_line_size = 0x20, - .ecache_lines = 0x8000, - .ecache_assoc = 1, - .mmu_nctx = 0x10000, - .initfn = tms390z55_init, - }, - { - .iu_version = 0x41000000, - .name = "TI,TMS390S10", - .psr_impl = 4, - .psr_vers = 1, - .impl = 4, - .vers = 1, - .dcache_line_size = 0x10, - .dcache_lines = 0x80, - .dcache_assoc = 4, - .icache_line_size = 0x20, - .icache_lines = 0x80, - .icache_assoc = 5, - .ecache_line_size = 0x20, - .ecache_lines = 0x8000, - .ecache_assoc = 1, - .mmu_nctx = 0x10000, - .initfn = tms390z55_init, - }, - { - .iu_version = 0x42000000, - .name = "TI,TMS390S10", - .psr_impl = 4, - .psr_vers = 2, - .impl = 4, - .vers = 2, - .dcache_line_size = 0x10, - .dcache_lines = 0x80, - .dcache_assoc = 4, - .icache_line_size = 0x20, - .icache_lines = 0x80, - .icache_assoc = 5, - .ecache_line_size = 0x20, - .ecache_lines = 0x8000, - .ecache_assoc = 1, - .mmu_nctx = 0x10000, - .initfn = tms390z55_init, - }, - { - .iu_version = 0x43000000, - .name = "TI,TMS390S10", - .psr_impl = 4, - .psr_vers = 3, - .impl = 4, - .vers = 3, - .dcache_line_size = 0x10, - .dcache_lines = 0x80, - .dcache_assoc = 4, - .icache_line_size = 0x20, - .icache_lines = 0x80, - .icache_assoc = 5, - .ecache_line_size = 0x20, - .ecache_lines = 0x8000, - .ecache_assoc = 1, - .mmu_nctx = 0x10000, - .initfn = tms390z55_init, - }, - { - .iu_version = 0x44000000, - .name = "TI,TMS390S10", - .psr_impl = 4, - .psr_vers = 4, - .impl = 4, - .vers = 4, - .dcache_line_size = 0x10, - .dcache_lines = 0x80, - .dcache_assoc = 4, - .icache_line_size = 0x20, - .icache_lines = 0x80, - .icache_assoc = 5, - .ecache_line_size = 0x20, - .ecache_lines = 0x8000, - .ecache_assoc = 1, - .mmu_nctx = 0x10000, - .initfn = tms390z55_init, - }, - { - .iu_version = 0x1e000000, - .name = "Ross,RT625", - .psr_impl = 1, - .psr_vers = 14, - .impl = 1, - .vers = 7, - .dcache_line_size = 0x20, - .dcache_lines = 0x80, - .dcache_assoc = 4, - .icache_line_size = 0x40, - .icache_lines = 0x40, - .icache_assoc = 5, - .ecache_line_size = 0x20, - .ecache_lines = 0x8000, - .ecache_assoc = 1, - .mmu_nctx = 0x10000, - .initfn = rt625_init, - }, - { - .iu_version = 0x1f000000, - .name = "Ross,RT620", - .psr_impl = 1, - .psr_vers = 15, - .impl = 1, - .vers = 7, - .dcache_line_size = 0x20, - .dcache_lines = 0x80, - .dcache_assoc = 4, - .icache_line_size = 0x40, - .icache_lines = 0x40, - .icache_assoc = 5, - .ecache_line_size = 0x20, - .ecache_lines = 0x8000, - .ecache_assoc = 1, - .mmu_nctx = 0x10000, - .initfn = rt625_init, - }, - { - .iu_version = 0x20000000, - .name = "BIT,B5010", - .initfn = bad_cpu_init, - }, - { - .iu_version = 0x50000000, - .name = "MC,MN10501", - .initfn = bad_cpu_init, - }, - { - .iu_version = 0x90 << 24, /* Impl 9, ver 0 */ - .name = "Weitek,W8601", - .initfn = bad_cpu_init, - }, - { - .iu_version = 0xf2000000, - .name = "GR,LEON2", - .initfn = bad_cpu_init, - }, - { - .iu_version = 0xf3000000, - .name = "GR,LEON3", - .initfn = bad_cpu_init, - }, -}; - -static const struct cpudef * -id_cpu(void) -{ - unsigned long iu_version; - unsigned int i; - - asm("rd %%psr, %0\n" - : "=r"(iu_version) :); - iu_version &= 0xff000000; - - 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 setup_cpu(int mid_offset) -{ - uint32_t temp; - unsigned int i; - const struct cpudef *cpu; - - // Add cpus - temp = fw_cfg_read_i32(FW_CFG_NB_CPUS); - - printk("CPUs: %x", temp); - cpu = id_cpu(); - printk(" x %s\n", cpu->name); - for (i = 0; i < temp; i++) { - push_str("/"); - fword("find-device"); - - fword("new-device"); - - push_str(cpu->name); - fword("device-name"); - - push_str("cpu"); - fword("device-type"); - - PUSH(cpu->psr_impl); - fword("encode-int"); - push_str("psr-implementation"); - fword("property"); - - PUSH(cpu->psr_vers); - fword("encode-int"); - push_str("psr-version"); - fword("property"); - - PUSH(cpu->impl); - fword("encode-int"); - push_str("implementation"); - fword("property"); - - PUSH(cpu->vers); - fword("encode-int"); - push_str("version"); - fword("property"); - - PUSH(4096); - fword("encode-int"); - push_str("page-size"); - fword("property"); - - PUSH(cpu->dcache_line_size); - fword("encode-int"); - push_str("dcache-line-size"); - fword("property"); - - PUSH(cpu->dcache_lines); - fword("encode-int"); - push_str("dcache-nlines"); - fword("property"); - - PUSH(cpu->dcache_assoc); - fword("encode-int"); - push_str("dcache-associativity"); - fword("property"); - - PUSH(cpu->icache_line_size); - fword("encode-int"); - push_str("icache-line-size"); - fword("property"); - - PUSH(cpu->icache_lines); - fword("encode-int"); - push_str("icache-nlines"); - fword("property"); - - PUSH(cpu->icache_assoc); - fword("encode-int"); - push_str("icache-associativity"); - fword("property"); - - PUSH(cpu->ecache_line_size); - fword("encode-int"); - push_str("ecache-line-size"); - fword("property"); - - PUSH(cpu->ecache_lines); - fword("encode-int"); - push_str("ecache-nlines"); - fword("property"); - - PUSH(cpu->ecache_assoc); - fword("encode-int"); - push_str("ecache-associativity"); - fword("property"); - - PUSH(2); - fword("encode-int"); - push_str("ncaches"); - fword("property"); - - PUSH(cpu->mmu_nctx); - fword("encode-int"); - push_str("mmu-nctx"); - fword("property"); - - PUSH(8); - fword("encode-int"); - push_str("sparc-version"); - fword("property"); - - push_str(""); - fword("encode-string"); - push_str("cache-coherence?"); - fword("property"); - - PUSH(i + mid_offset); - fword("encode-int"); - push_str("mid"); - fword("property"); - - cpu->initfn(); - - fword("finish-device"); - } -} - -static void dummy_mach_init(uint64_t base) -{ -} - -struct machdef { - uint16_t machine_id; - const char *banner_name; - const char *model; - const char *name; - void (*initfn)(uint64_t base); -}; - -static const struct machdef sun4m_defs[] = { - { - .machine_id = 32, - .banner_name = "SPARCstation 5", - .model = "SUNW,501-3059", - .name = "SUNW,SPARCstation-5", - .initfn = ss5_init, - }, - { - .machine_id = 33, - .banner_name = "SPARCstation Voyager", - .model = "SUNW,501-2581", - .name = "SUNW,SPARCstation-Voyager", - .initfn = dummy_mach_init, - }, - { - .machine_id = 34, - .banner_name = "SPARCstation LX", - .model = "SUNW,501-2031", - .name = "SUNW,SPARCstation-LX", - .initfn = dummy_mach_init, - }, - { - .machine_id = 35, - .banner_name = "SPARCstation 4", - .model = "SUNW,501-2572", - .name = "SUNW,SPARCstation-4", - .initfn = ss5_init, - }, - { - .machine_id = 36, - .banner_name = "SPARCstation Classic", - .model = "SUNW,501-2326", - .name = "SUNW,SPARCstation-Classic", - .initfn = dummy_mach_init, - }, - { - .machine_id = 37, - .banner_name = "Tadpole S3 GX", - .model = "S3", - .name = "Tadpole_S3GX", - .initfn = ss5_init, - }, - { - .machine_id = 64, - .banner_name = "SPARCstation 10 (1 X 390Z55)", - .model = "SUNW,S10,501-2365", - .name = "SUNW,SPARCstation-10", - .initfn = ob_eccmemctl_init, - }, - { - .machine_id = 65, - .banner_name = "SPARCstation 20 (1 X 390Z55)", - .model = "SUNW,S20,501-2324", - .name = "SUNW,SPARCstation-20", - .initfn = ob_eccmemctl_init, - }, - { - .machine_id = 66, - .banner_name = "SPARCsystem 600(1 X 390Z55)", - .model = NULL, - .name = "SUNW,SPARCsystem-600", - .initfn = ob_eccmemctl_init, - }, -}; - -static const struct machdef * -id_machine(uint16_t machine_id) -{ - unsigned int i; - - for (i = 0; i < sizeof(sun4m_defs)/sizeof(struct machdef); i++) { - if (machine_id == sun4m_defs[i].machine_id) - return &sun4m_defs[i]; - } - printk("Unknown machine (ID %d), freezing!\n", machine_id); - for (;;); -} - -static void setup_machine(uint64_t base) -{ - uint16_t machine_id; - const struct machdef *mach; - - machine_id = fw_cfg_read_i16(FW_CFG_MACHINE_ID); - mach = id_machine(machine_id); - - push_str("/"); - fword("find-device"); - push_str(mach->banner_name); - fword("encode-string"); - push_str("banner-name"); - fword("property"); - - if (mach->model) { - push_str(mach->model); - fword("encode-string"); - push_str("model"); - fword("property"); - } - push_str(mach->name); - fword("encode-string"); - push_str("name"); - fword("property"); - - mach->initfn(base); -} - -/* Add /uuid */ -static void setup_uuid(void) -{ - static uint8_t qemu_uuid[16]; - - 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"); -} - -static void setup_stdio(void) -{ - char nographic; - const char *stdin, *stdout; - - fw_cfg_read(FW_CFG_NOGRAPHIC, &nographic, 1); - if (nographic) { - obp_stdin = PROMDEV_TTYA; - obp_stdout = PROMDEV_TTYA; - stdin = "ttya"; - stdout = "ttya"; - } else { - obp_stdin = PROMDEV_KBD; - obp_stdout = PROMDEV_SCREEN; - stdin = "keyboard"; - stdout = "screen"; - } - - push_str(stdin); - push_str("input-device"); - fword("$setenv"); - - push_str(stdout); - push_str("output-device"); - fword("$setenv"); - - obp_stdin_path = stdin; - obp_stdout_path = stdout; -} - -static void init_memory(void) -{ - phys_addr_t phys; - ucell virt; - - /* Claim the memory from OFMEM */ - phys = ofmem_claim_phys(-1, MEMORY_SIZE, PAGE_SIZE); - if (!phys) - printk("panic: not enough physical memory on host system.\n"); - - virt = ofmem_claim_virt(OF_CODE_START - MEMORY_SIZE, MEMORY_SIZE, 0); - 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)); - - /* 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); -} - -static void -arch_init( void ) -{ - char *cmdline; - const char *kernel_cmdline; - uint32_t temp; - uint16_t machine_id; - char buf[256]; - unsigned long mem_size; - - 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(;;); - } - - graphic_depth = fw_cfg_read_i16(FW_CFG_SUN4M_DEPTH); - - openbios_init(); - modules_init(); - ob_init_mmu(); - ob_init_iommu(hwdef->iommu_base); -#ifdef CONFIG_DRIVER_OBIO - mem_size = fw_cfg_read_i32(FW_CFG_RAM_SIZE); - ob_obio_init(hwdef->slavio_base, hwdef->fd_offset, - hwdef->counter_offset, hwdef->intr_offset, hwdef->intr_ncpu, - hwdef->aux1_offset, hwdef->aux2_offset, - mem_size); - - setup_machine(hwdef->slavio_base); - - nvconf_init(); -#endif -#ifdef CONFIG_DRIVER_SBUS -#ifdef CONFIG_DEBUG_CONSOLE_VIDEO - setup_video(); -#endif - ob_sbus_init(hwdef->iommu_base + 0x1000ULL, qemu_machine_type); -#endif - device_end(); - - setup_cpu(hwdef->mid_offset); - - setup_stdio(); - /* Initialiase openprom romvec */ - romvec = init_openprom(); - - kernel_size = fw_cfg_read_i32(FW_CFG_KERNEL_SIZE); - if (kernel_size) { - kernel_image = fw_cfg_read_i32(FW_CFG_KERNEL_ADDR); - - /* Mark the kernel memory as in use */ - ofmem_claim_phys(PAGE_ALIGN(kernel_image), PAGE_ALIGN(kernel_size), 0); - ofmem_claim_virt(PAGE_ALIGN(kernel_image), PAGE_ALIGN(kernel_size), 0); - } - - kernel_cmdline = (const char *) fw_cfg_read_i32(FW_CFG_KERNEL_CMDLINE); - if (kernel_cmdline) { - cmdline = strdup(kernel_cmdline); - obp_arg.argv[1] = cmdline; - } else { - cmdline = strdup(""); - } - qemu_cmdline = (uint32_t)cmdline; - - /* Setup nvram variables */ - push_str("/options"); - fword("find-device"); - push_str(cmdline); - fword("encode-string"); - push_str("boot-file"); - fword("property"); - - boot_device = fw_cfg_read_i16(FW_CFG_BOOT_DEVICE); - - switch (boot_device) { - case 'a': - push_str("floppy"); - break; - case 'c': - push_str("disk"); - break; - default: - case 'd': - push_str("cdrom:d cdrom"); - break; - case 'n': - push_str("net"); - break; - } - - fword("encode-string"); - push_str("boot-device"); - fword("property"); - - device_end(); - - bind_func("platform-boot", boot ); - bind_func("(go)", go ); - - /* Set up other properties */ - push_str("/chosen"); - fword("find-device"); - - setup_uuid(); - - /* Enable interrupts */ - temp = get_psr(); - temp = (temp & ~PSR_PIL) | (13 << 8); /* Enable CPU timer interrupt (level 14) */ - put_psr(temp); -} - -extern struct _console_ops arch_console_ops; - -int openbios(void) -{ - unsigned int i; - - for (i = 0; i < sizeof(hwdefs) / sizeof(struct hwdef); i++) { - if (hwdefs[i].machine_id_low <= qemu_machine_type && - hwdefs[i].machine_id_high >= qemu_machine_type) { - hwdef = &hwdefs[i]; - break; - } - } - if (!hwdef) - for(;;); // Internal inconsistency, hang - -#ifdef CONFIG_DEBUG_CONSOLE - init_console(arch_console_ops); -#endif - /* Make sure we setup OFMEM before the MMU as we need malloc() to setup page tables */ - ofmem_init(); - -#ifdef CONFIG_DRIVER_SBUS - init_mmu_swift(); -#endif -#ifdef CONFIG_DEBUG_CONSOLE -#ifdef CONFIG_DEBUG_CONSOLE_SERIAL - escc_uart_init(hwdef->serial_base | (CONFIG_SERIAL_PORT? 0ULL: 4ULL), - CONFIG_SERIAL_SPEED); -#endif -#ifdef CONFIG_DEBUG_CONSOLE_VIDEO - kbd_init(hwdef->ms_kb_base); -#endif -#endif - - 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); - - free(dict); - return 0; -} |