Author: stepan
Date: 2006-05-11 01:00:34 +0200 (Thu, 11 May 2006)
New Revision: 16
Added:
openbios-devel/arch/sparc32/openprom.h
openbios-devel/arch/sparc32/romvec.c
Modified:
openbios-devel/arch/sparc32/build.xml
openbios-devel/arch/sparc32/elfload.c
openbios-devel/arch/sparc32/openbios.c
openbios-devel/arch/sparc32/tree.fs
openbios-devel/config/examples/cross-sparc32_config.xml
openbios-devel/config/examples/sparc32_config.xml
openbios-devel/drivers/esp.c
openbios-devel/drivers/iommu.c
openbios-devel/drivers/sbus.c
openbios-devel/include/openbios/bindings.h
openbios-devel/include/sparc32/io.h
openbios-devel/libc/misc.c
openbios-devel/modules/bindings.c
openbios-devel/modules/sun-parts.c
Log:
merge more sparc32 code from: Blue Swirl <blueswir1(a)hotmail.com>
Modified: openbios-devel/arch/sparc32/build.xml
===================================================================
--- openbios-devel/arch/sparc32/build.xml 2006-05-10 21:41:21 UTC (rev 15)
+++ openbios-devel/arch/sparc32/build.xml 2006-05-10 23:00:34 UTC (rev 16)
@@ -20,6 +20,7 @@
<object source="elfload.c"/>
<object source="forthload.c"/>
<object source="loadfs.c"/>
+ <object source="romvec.c"/>
</library>
<executable name="target/arch/sparc32/entry.o" target="target">
Modified: openbios-devel/arch/sparc32/elfload.c
===================================================================
--- openbios-devel/arch/sparc32/elfload.c 2006-05-10 21:41:21 UTC (rev 15)
+++ openbios-devel/arch/sparc32/elfload.c 2006-05-10 23:00:34 UTC (rev 16)
@@ -369,7 +369,22 @@
debug("entry point is %#x\n", addr_fixup(ehdr.e_entry));
printf("Jumping to entry point...\n");
+
+#if 1
+ {
+ extern unsigned int qemu_mem_size;
+ void *init_openprom(unsigned long memsize, const char *cmdline, char boot_device);
+
+ int (*entry)(const void *romvec, int p2, int p3, int p4, int p5);
+ const void *romvec;
+
+ romvec = init_openprom(qemu_mem_size, NULL, 'c');
+ entry = (void *) addr_fixup(ehdr.e_entry);
+ image_retval = entry(romvec, 0, 0, 0, 0);
+ }
+#else
image_retval = start_elf(addr_fixup(ehdr.e_entry), virt_to_phys(boot_notes));
+#endif
// console_init(); FIXME
printf("Image returned with return value %#x\n", image_retval);
Modified: openbios-devel/arch/sparc32/openbios.c
===================================================================
--- openbios-devel/arch/sparc32/openbios.c 2006-05-10 21:41:21 UTC (rev 15)
+++ openbios-devel/arch/sparc32/openbios.c 2006-05-10 23:00:34 UTC (rev 16)
@@ -23,6 +23,8 @@
static void init_memory(void)
{
+ extern char _heap, _eheap;
+
/* push start and end of available memory to the stack
* so that the forth word QUIT can initialize memory
* management. For now we use hardcoded memory between
@@ -30,8 +32,8 @@
* than that we have serious bloat.
*/
- PUSH(0x10000);
- PUSH(0x9FFFF);
+ PUSH((unsigned int)&_heap);
+ PUSH((unsigned int)&_eheap);
}
void exception(cell no)
Added: openbios-devel/arch/sparc32/openprom.h
===================================================================
--- openbios-devel/arch/sparc32/openprom.h (rev 0)
+++ openbios-devel/arch/sparc32/openprom.h 2006-05-10 23:00:34 UTC (rev 16)
@@ -0,0 +1,257 @@
+#ifndef __SPARC_OPENPROM_H
+#define __SPARC_OPENPROM_H
+
+/* openprom.h: Prom structures and defines for access to the OPENBOOT
+ * prom routines and data areas.
+ *
+ * Copyright (C) 1995 David S. Miller (davem(a)caip.rutgers.edu)
+ */
+
+// #include <asm/vaddrs.h>
+
+/* Empirical constants... */
+#define LINUX_OPPROM_MAGIC 0x10010407
+
+#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;
+ char *start_adr;
+ unsigned num_bytes;
+};
+
+struct linux_mem_v0 {
+ struct linux_mlist_v0 * const *v0_totphys;
+ struct linux_mlist_v0 * const *v0_prommap;
+ struct linux_mlist_v0 * const *v0_available; /* What we can use */
+};
+
+/* Arguments sent to the kernel from the boot prompt. */
+struct linux_arguments_v0 {
+ const char *argv[8];
+ char args[100];
+ char boot_dev[2];
+ int boot_dev_ctrl;
+ int boot_dev_unit;
+ int dev_partition;
+ const char *kernel_file_name;
+ void *aieee1; /* XXX */
+};
+
+/* V2 and up boot things. */
+struct linux_bootargs_v2 {
+ const char **bootpath;
+ const char **bootargs;
+ const int *fd_stdin;
+ const 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. */
+ const struct linux_nodeops *pv_nodeops;
+
+ char **pv_bootstr;
+ struct linux_dev_v0_funcs pv_v0devops;
+
+ const char *pv_stdin;
+ const 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;
+
+ const struct linux_arguments_v0 * const *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);
+ const 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 int which_io; /* is this in OBIO space? */
+ unsigned int phys_addr; /* The physical address of this register */
+ unsigned int reg_size; /* How many bytes does this register take up? */
+};
+
+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;
+};
+
+/* Ranges and reg properties are a bit different for PCI. */
+struct linux_prom_pci_registers {
+ /*
+ * We don't know what information this field contain.
+ * We guess, PCI device function is in bits 15:8
+ * So, ...
+ */
+ unsigned int which_io; /* Let it be which_io */
+
+ unsigned int phys_hi;
+ 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_assigned_addresses {
+ unsigned int which_io;
+
+ unsigned int phys_hi;
+ unsigned int phys_lo;
+
+ unsigned int size_hi;
+ unsigned int size_lo;
+};
+
+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;
+};
+
+#endif /* !(__ASSEMBLY__) */
+
+#endif /* !(__SPARC_OPENPROM_H) */
Added: openbios-devel/arch/sparc32/romvec.c
===================================================================
--- openbios-devel/arch/sparc32/romvec.c (rev 0)
+++ openbios-devel/arch/sparc32/romvec.c 2006-05-10 23:00:34 UTC (rev 16)
@@ -0,0 +1,440 @@
+/*
+ * PROM interface support
+ * Copyright 1996 The Australian National University.
+ * Copyright 1996 Fujitsu Laboratories Limited
+ * Copyright 1999 Pete A. Zaitcev
+ * This software may be distributed under the terms of the Gnu
+ * Public License version 2 or later
+ */
+
+#include "openprom.h"
+#include "stdint.h"
+#include "asm/io.h"
+#include "asm/types.h"
+#include "libc/vsprintf.h"
+#include "openbios/config.h"
+#include "openbios/bindings.h"
+#include "openbios/kernel.h"
+#include "openbios/sysinclude.h"
+
+//#define DEBUG_OBP
+
+#ifdef DEBUG_OBP
+#define DPRINTF(fmt, args...) \
+ do { printk(fmt , ##args); } while (0)
+#else
+#define DPRINTF(fmt, args...)
+#endif
+
+#define PAGE_SIZE 4096
+
+static struct linux_mlist_v0 totphys[1];
+static struct linux_mlist_v0 totmap[1];
+static struct linux_mlist_v0 totavail[1];
+
+static struct linux_mlist_v0 *ptphys;
+static struct linux_mlist_v0 *ptmap;
+static struct linux_mlist_v0 *ptavail;
+static char obp_stdin, obp_stdout;
+static int obp_fd_stdin, obp_fd_stdout;
+
+static int obp_nextnode(int node);
+static int obp_child(int node);
+static int obp_proplen(int node, char *name);
+static int obp_getprop(int node, char *name, char *val);
+static int obp_setprop(int node, char *name, char *val, int len);
+static const char *obp_nextprop(int node, char *name);
+
+static const struct linux_nodeops nodeops0 = {
+ obp_nextnode, /* int (*no_nextnode)(int node); */
+ obp_child, /* int (*no_child)(int node); */
+ obp_proplen, /* int (*no_proplen)(int node, char *name); */
+ obp_getprop, /* int (*no_getprop)(int node,char *name,char *val); */
+ obp_setprop, /* int (*no_setprop)(int node, char *name,
+ char *val, int len); */
+ obp_nextprop /* char * (*no_nextprop)(int node, char *name); */
+};
+
+static struct linux_arguments_v0 obp_arg;
+static const struct linux_arguments_v0 * const obp_argp = &obp_arg;
+
+static void (*synch_hook)(void);
+
+static struct linux_romvec romvec0;
+static int prop_mem_reg[3];
+static int prop_mem_avail[3];
+static int prop_vmem_avail[6];
+
+static void doublewalk(unsigned ptab1, unsigned va)
+{
+}
+
+static int obp_nextnode(int node)
+{
+ int peer;
+
+ PUSH(node);
+ fword("peer");
+ peer = POP();
+ DPRINTF("obp_nextnode(%x) = %x\n", node, peer);
+
+ return peer;
+}
+
+static int obp_child(int node)
+{
+ int child;
+
+ PUSH(node);
+ fword("child");
+ child = POP();
+ DPRINTF("obp_child(%x) = %x\n", node, child);
+
+ return child;
+}
+
+static int obp_proplen(int node, char *name)
+{
+ int notfound;
+
+ push_str(name);
+ PUSH(node);
+ fword("get-package-property");
+ notfound = POP();
+
+ if (notfound) {
+ DPRINTF("obp_proplen(%x, %s) (not found)\n", node, name);
+ (void) POP();
+ (void) POP();
+
+ return -1;
+ } else {
+ int len;
+
+ len = POP();
+ (void) POP();
+ DPRINTF("obp_proplen(%x, %s) = %d\n", node, name, len);
+
+ return len;
+ }
+}
+
+static int obp_getprop(int node, char *name, char *value)
+{
+ int notfound;
+
+ if (!name) {
+ // NULL name means get first property
+ name = "NULL";
+ push_str("");
+ PUSH(node);
+ fword("next-property");
+ notfound = POP();
+ notfound = !notfound; // Different return value
+ } else {
+ push_str(name);
+ PUSH(node);
+ fword("get-package-property");
+ notfound = POP();
+ }
+ if (notfound) {
+ DPRINTF("obp_getprop(%x, %s) (not found)\n", node, name);
+ (void) POP();
+ (void) POP();
+
+ return -1;
+ } else {
+ int len;
+ char *str;
+
+ len = POP();
+ str = (char *) POP();
+ memcpy(value, str, len);
+
+ DPRINTF("obp_getprop(%x, %s) = %s\n", node, name, str);
+
+ return len;
+ }
+}
+
+static int obp_setprop(__attribute__((unused)) int node,
+ __attribute__((unused)) char *name,
+ __attribute__((unused)) char *value,
+ __attribute__((unused)) int len)
+{
+ DPRINTF("obp_setprop(%x, %s) = %s (%d)\n", node, name, value, len);
+
+ return -1;
+}
+
+static const char *obp_nextprop(int node, char *name)
+{
+ if (!name || *name == '\0') {
+ // NULL name means get first property
+ DPRINTF("obp_nextprop(%x, NULL)\n", node);
+ return 0;
+ }
+ DPRINTF("obp_nextprop(%x, %s)\n", node, name);
+
+ return 0;
+}
+
+static int obp_nbgetchar(void)
+{
+ return 0;
+}
+
+static int obp_nbputchar(int ch)
+{
+ putchar(ch);
+
+ return 0;
+}
+
+static void obp_reboot(char *str)
+{
+ printk("rebooting (%s)\n", str);
+ outb(0x71f00000, 1);
+ for (;;) {}
+}
+
+static void obp_abort()
+{
+ printk("abort, power off\n");
+ outb(0x71910000, 1);
+ for (;;) {}
+}
+
+static void obp_halt()
+{
+ printk("halt, power off\n");
+ outb(0x71910000, 1);
+ for (;;) {}
+}
+
+static int obp_devopen(char *str)
+{
+ DPRINTF("obp_devopen(%s)\n", str);
+
+ return 0;
+}
+
+static int obp_devclose(__attribute__((unused)) int dev_desc)
+{
+ DPRINTF("obp_devclose %x\n", dev_desc);
+
+ return 0;
+}
+
+static int obp_rdblkdev(int dev_desc, int num_blks, int offset, char *buf)
+{
+ DPRINTF("obp_rdblkdev: fd %x, num_blks %d, offset %d, buf 0x%x\n", dev_desc, num_blks, offset, buf);
+
+ return 0;
+}
+
+static char *obp_dumb_mmap(char *va, __attribute__((unused)) int which_io,
+ unsigned int pa, unsigned int size)
+{
+ unsigned int npages;
+ unsigned int off;
+ unsigned int mva;
+
+ DPRINTF("obp_dumb_mmap: virta %x, which_io %d, paddr %x, sz %d\n", va, which_io, pa, size);
+ off = pa & (PAGE_SIZE-1);
+ npages = (off + size + (PAGE_SIZE-1)) / PAGE_SIZE;
+ pa &= ~(PAGE_SIZE-1);
+
+ mva = (unsigned int) va;
+ while (npages-- != 0) {
+ map_page(mva, pa, 1);
+ mva += PAGE_SIZE;
+ pa += PAGE_SIZE;
+ }
+
+ return va;
+}
+
+static void obp_dumb_munmap(__attribute__((unused)) char *va,
+ __attribute__((unused)) unsigned int size)
+{
+ DPRINTF("obp_dumb_munmap: virta %x, sz %d\n", va, size);
+}
+
+static int obp_devread(int dev_desc, char *buf, int nbytes)
+{
+ DPRINTF("obp_devread: fd %d, nbytes %d\n", dev_desc, nbytes);
+
+ return 0;
+}
+
+static int obp_devwrite(int dev_desc, char *buf, int nbytes)
+{
+ DPRINTF("obp_devwrite: fd %d, buf %s, nbytes %d\n", dev_desc, buf, nbytes);
+
+ return nbytes;
+}
+
+static int obp_devseek(int dev_desc, __attribute__((unused)) int hi, int lo)
+{
+ DPRINTF("obp_devseek: fd %d, hi %d, lo %d\n", dev_desc, hi, lo);
+
+ return 0;
+}
+
+static int obp_inst2pkg(int dev_desc)
+{
+ DPRINTF("obp_inst2pkg: fd %d\n", dev_desc);
+
+ return 0;
+}
+
+static int obp_cpustart(unsigned int whichcpu, int ctxtbl_ptr,
+ int thiscontext, char *prog_counter)
+{
+ //int cpu, found;
+ struct linux_prom_registers *smp_ctable = (void *)ctxtbl_ptr;
+
+ DPRINTF("obp_cpustart: cpu %d, ctxptr %x, ctx %d, pc %x\n", whichcpu,
+ smp_ctable->phys_addr, thiscontext, prog_counter);
+#if 0
+ found = obp_getprop(whichcpu, "mid", (char *)&cpu);
+ if (found == -1)
+ return -1;
+ st_bypass(PHYS_JJ_EEPROM + 0x38, (unsigned int)prog_counter);
+ st_bypass(PHYS_JJ_EEPROM + 0x3C, ((unsigned int)smp_ctable->phys_addr) >> 4);
+ st_bypass(PHYS_JJ_EEPROM + 0x40, thiscontext);
+ DPRINTF("obp_cpustart: sending interrupt to CPU %d\n", cpu);
+ st_bypass(PHYS_JJ_INTR0 + 0x1000 * cpu + 8, 0x40000000);
+#endif
+
+ return 0;
+}
+
+static int obp_cpustop(__attribute__((unused)) unsigned int whichcpu)
+{
+ DPRINTF("obp_cpustop: cpu %d\n", whichcpu);
+
+ return 0;
+}
+
+static int obp_cpuidle(__attribute__((unused)) unsigned int whichcpu)
+{
+ DPRINTF("obp_cpuidle: cpu %d\n", whichcpu);
+
+ return 0;
+}
+
+static int obp_cpuresume(__attribute__((unused)) unsigned int whichcpu)
+{
+ DPRINTF("obp_cpuresume: cpu %d\n", whichcpu);
+
+ return 0;
+}
+
+void *
+init_openprom(unsigned long memsize, const char *cmdline, char boot_device)
+{
+ ptphys = totphys;
+ ptmap = totmap;
+ ptavail = totavail;
+
+ /*
+ * Form memory descriptors.
+ */
+ totphys[0].theres_more = 0;
+ totphys[0].start_adr = (char *) 0;
+ totphys[0].num_bytes = memsize;
+
+ totavail[0].theres_more = 0;
+ totavail[0].start_adr = (char*) 0;
+ totavail[0].num_bytes = memsize;
+
+ totmap[0].theres_more = 0;
+ totmap[0].start_adr = &_start;
+ totmap[0].num_bytes = (unsigned long) &_iomem - (unsigned long) &_start;
+
+ prop_mem_reg[0] = 0;
+ prop_mem_reg[1] = 0;
+ prop_mem_reg[2] = memsize;
+ prop_mem_avail[0] = 0;
+ prop_mem_avail[1] = 0;
+ prop_mem_avail[2] = va2pa((unsigned long)&_data);
+ prop_vmem_avail[0] = 0;
+ prop_vmem_avail[1] = 0;
+ prop_vmem_avail[2] = (unsigned long)&_start - 1;
+ prop_vmem_avail[3] = 0;
+ prop_vmem_avail[4] = 0xffe00000;
+ prop_vmem_avail[5] = 0x00200000;
+
+ // Linux wants a R/W romvec table
+ romvec0.pv_magic_cookie = LINUX_OPPROM_MAGIC;
+ romvec0.pv_romvers = 0;
+ romvec0.pv_plugin_revision = 77;
+ romvec0.pv_printrev = 0x10203;
+ romvec0.pv_v0mem.v0_totphys = &ptphys;
+ romvec0.pv_v0mem.v0_prommap = &ptmap;
+ romvec0.pv_v0mem.v0_available = &ptavail;
+ romvec0.pv_nodeops = &nodeops0;
+ romvec0.pv_bootstr = (void *)doublewalk;
+ romvec0.pv_v0devops.v0_devopen = &obp_devopen;
+ romvec0.pv_v0devops.v0_devclose = &obp_devclose;
+ romvec0.pv_v0devops.v0_rdblkdev = &obp_rdblkdev;
+ romvec0.pv_stdin = &obp_stdin;
+ romvec0.pv_stdout = &obp_stdout;
+ romvec0.pv_getchar = obp_nbgetchar;
+ romvec0.pv_putchar = (void (*)(int))obp_nbputchar;
+ romvec0.pv_nbgetchar = obp_nbgetchar;
+ romvec0.pv_nbputchar = obp_nbputchar;
+ romvec0.pv_reboot = obp_reboot;
+ romvec0.pv_printf = (void (*)(const char *fmt, ...))printk;
+ romvec0.pv_abort = obp_abort;
+ romvec0.pv_halt = obp_halt;
+ romvec0.pv_synchook = &synch_hook;
+ romvec0.pv_v0bootargs = &obp_argp;
+ romvec0.pv_v2devops.v2_inst2pkg = obp_inst2pkg;
+ romvec0.pv_v2devops.v2_dumb_mmap = obp_dumb_mmap;
+ romvec0.pv_v2devops.v2_dumb_munmap = obp_dumb_munmap;
+ romvec0.pv_v2devops.v2_dev_open = obp_devopen;
+ romvec0.pv_v2devops.v2_dev_close = (void (*)(int))obp_devclose;
+ romvec0.pv_v2devops.v2_dev_read = obp_devread;
+ romvec0.pv_v2devops.v2_dev_write = obp_devwrite;
+ romvec0.pv_v2devops.v2_dev_seek = obp_devseek;
+ obp_arg.boot_dev_ctrl = 0;
+ obp_arg.boot_dev_unit = '0';
+ obp_arg.argv[0] = "sd(0,0,0):d";
+
+ switch(boot_device) {
+ default:
+ case 'a':
+ obp_arg.argv[0] = "fd()";
+ obp_arg.boot_dev[0] = 'f';
+ obp_arg.boot_dev[1] = 'd';
+ break;
+ case 'd':
+ obp_arg.boot_dev_unit = '2';
+ obp_arg.argv[0] = "sd(0,2,0):d";
+ // Fall through
+ case 'c':
+ obp_arg.boot_dev[0] = 's';
+ obp_arg.boot_dev[1] = 'd';
+ break;
+ case 'n':
+ obp_arg.argv[0] = "le()";
+ obp_arg.boot_dev[0] = 'l';
+ obp_arg.boot_dev[1] = 'e';
+ break;
+ }
+ obp_arg.argv[1] = cmdline;
+ romvec0.pv_v2bootargs.bootpath = &obp_arg.argv[0];
+ romvec0.pv_v2bootargs.bootargs = &cmdline;
+ romvec0.pv_v2bootargs.fd_stdin = &obp_fd_stdin;
+ romvec0.pv_v2bootargs.fd_stdout = &obp_fd_stdout;
+
+ romvec0.v3_cpustart = obp_cpustart;
+ romvec0.v3_cpustop = obp_cpustop;
+ romvec0.v3_cpuidle = obp_cpuidle;
+ romvec0.v3_cpuresume = obp_cpuresume;
+
+ return &romvec0;
+}
Modified: openbios-devel/arch/sparc32/tree.fs
===================================================================
--- openbios-devel/arch/sparc32/tree.fs 2006-05-10 21:41:21 UTC (rev 15)
+++ openbios-devel/arch/sparc32/tree.fs 2006-05-10 23:00:34 UTC (rev 16)
@@ -3,14 +3,18 @@
2 encode-int " #address-cells" property
1 encode-int " #size-cells" property
" SUNW,SparcStation-5" encode-string " name" property
- " " encode-string " idprom" property
" SparcStation" encode-string " banner-name" property
" sun4m" encode-string " compatible" property
+ h# 01800000 encode-int 0 encode-int encode+ 0 encode-int encode+ h# 00000081 encode-int encode+
+ 0 encode-int encode+ 0 encode-int encode+ 0 encode-int encode+ 0 encode-int encode+
+ " idprom" property \ XXX
: encode-unit encode-unit-sbus ;
: decode-unit decode-unit-sbus ;
new-device
" memory" device-name
+ h# 100000 encode-int " available" property \ XXX
+ h# 0 encode-int h# 10000000 encode-int encode+ h# 00000300 encode-int encode+ " reg" property \ XXX
external
: open true ;
: close ;
@@ -19,6 +23,17 @@
finish-device
new-device
+ " virtual-memory" device-name
+ h# 100000 encode-int " available" property \ XXX
+ h# 0 encode-int h# 10000000 encode-int encode+ h# 00000300 encode-int encode+ " reg" property \ XXX
+ external
+ : open true ;
+ : close ;
+ \ claim ( phys size align -- base )
+ \ release ( phys size -- )
+finish-device
+
+new-device
" STP1012PGA" device-name
" cpu" device-type
d# 256 encode-int " mmu-nctx" property
@@ -33,7 +48,7 @@
1 encode-int " #size-cells" property
h# 0 encode-int h# 10000000 encode-int encode+ h# 00000300 encode-int encode+ " reg" property
external
- : open cr ." opening iommu" cr true ;
+ : open ( cr ." opening iommu" cr) true ;
: close ;
: encode-unit encode-unit-sbus ;
: decode-unit decode-unit-sbus ;
@@ -53,7 +68,7 @@
" ranges" property
h# 0 encode-int h# 10001000 encode-int encode+ h# 00000028 encode-int encode+ " reg" property
external
- : open cr ." opening SBus" cr true ;
+ : open ( cr ." opening SBus" cr) true ;
: close ;
: encode-unit encode-unit-sbus ;
: decode-unit decode-unit-sbus ;
@@ -157,7 +172,7 @@
h# 0 encode-int h# 0 encode-int encode+ h# 0 encode-int encode+ h# 71000000 encode-int encode+ h# 01000000 encode-int encode+
" ranges" property
external
- : open cr ." opening obio" cr true ;
+ : open ( cr ." opening obio" cr) true ;
: close ;
: encode-unit encode-unit-sbus ;
: decode-unit decode-unit-sbus ;
Modified: openbios-devel/config/examples/cross-sparc32_config.xml
===================================================================
--- openbios-devel/config/examples/cross-sparc32_config.xml 2006-05-10 21:41:21 UTC (rev 15)
+++ openbios-devel/config/examples/cross-sparc32_config.xml 2006-05-10 23:00:34 UTC (rev 16)
@@ -26,7 +26,8 @@
<option name="CONFIG_DEBUG_INTERPRETER" type="boolean" value="false"/>
<option name="CONFIG_DEBUG_CONSOLE" type="boolean" value="true"/>
<option name="CONFIG_DEBUG_CONSOLE_SERIAL" type="boolean" value="true"/>
- <option name="CONFIG_DEBUG_ESP" type="boolean" value="true"/>
+ <option name="CONFIG_DEBUG_ESP" type="boolean" value="false"/>
+ <option name="CONFIG_DEBUG_SUN_PARTS" type="boolean" value="false"/>
<option name="CONFIG_SERIAL_PORT" type="integer" value="0"/>
<option name="CONFIG_SERIAL_SPEED" type="integer" value="115200"/>
@@ -43,13 +44,13 @@
<option name="CONFIG_SUN_PARTS" type="boolean" value="true"/>
<option name="CONFIG_FS" type="boolean" value="true"/>
<option name="CONFIG_HFS" type="boolean" value="false"/>
- <option name="CONFIG_HFSP" type="boolean" value="true"/>
+ <option name="CONFIG_HFSP" type="boolean" value="false"/>
<option name="CONFIG_GRUBFS" type="boolean" value="true"/>
<option name="CONFIG_FSYS_EXT2FS" type="boolean" value="true"/>
<option name="CONFIG_FSYS_FAT" type="boolean" value="false"/>
<option name="CONFIG_FSYS_JFS" type="boolean" value="false"/>
<option name="CONFIG_FSYS_MINIX" type="boolean" value="false"/>
- <option name="CONFIG_FSYS_REISERFS" type="boolean" value="true"/>
+ <option name="CONFIG_FSYS_REISERFS" type="boolean" value="false"/>
<option name="CONFIG_FSYS_XFS" type="boolean" value="false"/>
<option name="CONFIG_FSYS_UFS" type="boolean" value="true"/>
<option name="CONFIG_FSYS_ISO9660" type="boolean" value="true"/>
Modified: openbios-devel/config/examples/sparc32_config.xml
===================================================================
--- openbios-devel/config/examples/sparc32_config.xml 2006-05-10 21:41:21 UTC (rev 15)
+++ openbios-devel/config/examples/sparc32_config.xml 2006-05-10 23:00:34 UTC (rev 16)
@@ -26,6 +26,8 @@
<option name="CONFIG_DEBUG_INTERPRETER" type="boolean" value="false"/>
<option name="CONFIG_DEBUG_CONSOLE" type="boolean" value="true"/>
<option name="CONFIG_DEBUG_CONSOLE_SERIAL" type="boolean" value="true"/>
+ <option name="CONFIG_DEBUG_ESP" type="boolean" value="false"/>
+ <option name="CONFIG_DEBUG_SUN_PARTS" type="boolean" value="false"/>
<option name="CONFIG_SERIAL_PORT" type="integer" value="0"/>
<option name="CONFIG_SERIAL_SPEED" type="integer" value="115200"/>
@@ -42,13 +44,13 @@
<option name="CONFIG_SUN_PARTS" type="boolean" value="true"/>
<option name="CONFIG_FS" type="boolean" value="true"/>
<option name="CONFIG_HFS" type="boolean" value="false"/>
- <option name="CONFIG_HFSP" type="boolean" value="true"/>
+ <option name="CONFIG_HFSP" type="boolean" value="false"/>
<option name="CONFIG_GRUBFS" type="boolean" value="true"/>
<option name="CONFIG_FSYS_EXT2FS" type="boolean" value="true"/>
<option name="CONFIG_FSYS_FAT" type="boolean" value="false"/>
<option name="CONFIG_FSYS_JFS" type="boolean" value="false"/>
<option name="CONFIG_FSYS_MINIX" type="boolean" value="false"/>
- <option name="CONFIG_FSYS_REISERFS" type="boolean" value="true"/>
+ <option name="CONFIG_FSYS_REISERFS" type="boolean" value="false"/>
<option name="CONFIG_FSYS_XFS" type="boolean" value="false"/>
<option name="CONFIG_FSYS_UFS" type="boolean" value="true"/>
<option name="CONFIG_FSYS_ISO9660" type="boolean" value="true"/>
Modified: openbios-devel/drivers/esp.c
===================================================================
--- openbios-devel/drivers/esp.c 2006-05-10 21:41:21 UTC (rev 15)
+++ openbios-devel/drivers/esp.c 2006-05-10 23:00:34 UTC (rev 16)
@@ -35,7 +35,7 @@
} while(0)
#define REGISTER_NODE_METHODS( name, path ) do { \
- char *paths[1]; \
+ const char *paths[1]; \
\
paths[0] = path; \
bind_node( name##_flags_, name##_size_, \
@@ -76,9 +76,9 @@
DECLARE_UNNAMED_NODE(ob_sd, INSTALL_OPEN, sizeof(sd_private_t *));
DECLARE_UNNAMED_NODE(ob_esp, INSTALL_OPEN, sizeof(esp_private_t *));
+#ifdef CONFIG_DEBUG_ESP
static void dump_drive(sd_private_t *drive)
{
-#ifdef CONFIG_DEBUG_ESP
printk("SCSI DRIVE @%lx:\n", (unsigned long)drive);
printk("id: %d\n", drive->id);
printk("media: %s\n", drive->media_str);
@@ -86,8 +86,8 @@
printk("sectors: %d\n", drive->sectors);
printk("present: %d\n", drive->present);
printk("bs: %d\n", drive->bs);
+}
#endif
-}
static int
do_command(esp_private_t *esp, sd_private_t *sd, int cmdlen, int replylen)
Modified: openbios-devel/drivers/iommu.c
===================================================================
--- openbios-devel/drivers/iommu.c 2006-05-10 21:41:21 UTC (rev 15)
+++ openbios-devel/drivers/iommu.c 2006-05-10 23:00:34 UTC (rev 16)
@@ -35,8 +35,8 @@
unsigned int va_shift;
-unsigned long *context_table;
-unsigned long *l1;
+static unsigned long *context_table;
+static unsigned long *l1;
/*
* IOMMU parameters
@@ -105,21 +105,20 @@
* highbase is used for v2p translation.
*/
int
-map_page(unsigned long *pgd, unsigned long va,
- unsigned long epa, int type)
+map_page(unsigned long va, unsigned long epa, int type)
{
uint32_t pte;
void *p;
unsigned long pa;
- pte = pgd[(va >> SRMMU_PGDIR_SHIFT) & (SRMMU_PTRS_PER_PGD - 1)];
+ pte = l1[(va >> SRMMU_PGDIR_SHIFT) & (SRMMU_PTRS_PER_PGD - 1)];
if ((pte & SRMMU_ET_MASK) == SRMMU_ET_INVALID) {
p = mem_zalloc(&cmem, SRMMU_PTRS_PER_PMD * sizeof(int),
SRMMU_PTRS_PER_PMD * sizeof(int));
if (p == 0)
goto drop;
pte = SRMMU_ET_PTD | ((va2pa((unsigned long)p)) >> 4);
- pgd[(va >> SRMMU_PGDIR_SHIFT) & (SRMMU_PTRS_PER_PGD - 1)] = pte;
+ l1[(va >> SRMMU_PGDIR_SHIFT) & (SRMMU_PTRS_PER_PGD - 1)] = pte;
/* barrier() */
}
@@ -178,9 +177,9 @@
return va;
mva = (unsigned int) va;
- printk("map_io: va 0x%p pa 0x%x off 0x%x npages %d\n", va, pa, off, npages); /* P3 */
+ //printk("map_io: va 0x%p pa 0x%x off 0x%x npages %d\n", va, pa, off, npages); /* P3 */
while (npages-- != 0) {
- map_page(l1, mva, pa, 1);
+ map_page(mva, pa, 1);
mva += PAGE_SIZE;
pa += PAGE_SIZE;
}
@@ -215,20 +214,20 @@
// 1:1 mapping for ROM
pa = va = (unsigned long)&_start;
for (; va < (unsigned long)&_data; va += PAGE_SIZE, pa += PAGE_SIZE) {
- map_page(l1, va, pa, 0);
+ map_page(va, pa, 0);
}
// data & bss mapped to end of RAM
va = (unsigned long)&_data;
for (; va < (unsigned long)&_end; va += PAGE_SIZE) {
pa = va2pa(va);
- map_page(l1, va, pa, 0);
+ map_page(va, pa, 0);
}
// 1:1 mapping for RAM
pa = va = 0;
for (; va < LOWMEMSZ; va += PAGE_SIZE, pa += PAGE_SIZE) {
- map_page(l1, va, pa, 0);
+ map_page(va, pa, 0);
}
/*
@@ -279,7 +278,7 @@
mva = (unsigned int) va;
mpa = (unsigned int) pa;
for (i = 0; i < npages; i++) {
- map_page(l1, mva, mpa, 1);
+ map_page(mva, mpa, 1);
mva += PAGE_SIZE;
mpa += PAGE_SIZE;
}
Modified: openbios-devel/drivers/sbus.c
===================================================================
--- openbios-devel/drivers/sbus.c 2006-05-10 21:41:21 UTC (rev 15)
+++ openbios-devel/drivers/sbus.c 2006-05-10 23:00:34 UTC (rev 16)
@@ -46,7 +46,7 @@
int ob_sbus_init(void)
{
- printk("Initializing SBus devices...\n");
+ //printk("Initializing SBus devices...\n");
return 0;
}
Modified: openbios-devel/include/openbios/bindings.h
===================================================================
--- openbios-devel/include/openbios/bindings.h 2006-05-10 21:41:21 UTC (rev 15)
+++ openbios-devel/include/openbios/bindings.h 2006-05-10 23:00:34 UTC (rev 16)
@@ -124,11 +124,11 @@
name##_m, sizeof(name##_m)/sizeof(method_t) ); \
} while(0)
-extern void bind_node( int flags, int size, char **paths, int npaths,
- method_t *methods, int nmethods );
+extern void bind_node( int flags, int size, const char * const *paths, int npaths,
+ const method_t *methods, int nmethods );
-extern void bind_new_node( int flags, int size, char *name,
- method_t *methods, int nmethods );
+extern void bind_new_node( int flags, int size, const char *name,
+ const method_t *methods, int nmethods );
#define INSTALL_OPEN 1 /* install trivial open and close methods */
Modified: openbios-devel/include/sparc32/io.h
===================================================================
--- openbios-devel/include/sparc32/io.h 2006-05-10 21:41:21 UTC (rev 15)
+++ openbios-devel/include/sparc32/io.h 2006-05-10 23:00:34 UTC (rev 16)
@@ -34,8 +34,7 @@
void *mem_alloc(struct mem *t, int size, int align);
void *mem_zalloc(struct mem *t, int size, int align);
-int map_page(unsigned long *pgd, unsigned long va,
- unsigned long epa, int type);
+int map_page(unsigned long va, unsigned long epa, int type);
void *map_io(unsigned pa, int size);
void init_mmu_swift();
void *dvma_alloc(int size, unsigned int *pphys);
Modified: openbios-devel/libc/misc.c
===================================================================
--- openbios-devel/libc/misc.c 2006-05-10 21:41:21 UTC (rev 15)
+++ openbios-devel/libc/misc.c 2006-05-10 23:00:34 UTC (rev 16)
@@ -22,7 +22,7 @@
void
qsort( void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void*) )
{
- int worked, i, j;
+ unsigned int worked, i, j;
/* even more inefficient than the glibc variant :-) */
do {
Modified: openbios-devel/modules/bindings.c
===================================================================
--- openbios-devel/modules/bindings.c 2006-05-10 21:41:21 UTC (rev 15)
+++ openbios-devel/modules/bindings.c 2006-05-10 23:00:34 UTC (rev 16)
@@ -431,7 +431,7 @@
static void
-add_methods( int flags, int size, method_t *methods, int nmet )
+add_methods( int flags, int size, const method_t *methods, int nmet )
{
xt_t xt=0;
int i;
@@ -470,14 +470,14 @@
}
void
-bind_node( int flags, int size, char **paths, int npaths,
- method_t *methods, int nmet )
+bind_node( int flags, int size, const char * const *paths, int npaths,
+ const method_t *methods, int nmet )
{
phandle_t save_ph = get_cur_dev();
int i;
for( i=0; i<npaths; i++ ) {
- char *name = paths[i];
+ const char *name = paths[i];
/* type matching? */
if( *name == 'T' ) {
@@ -506,8 +506,8 @@
}
void
-bind_new_node( int flags, int size, char *name,
- method_t *methods, int nmet )
+bind_new_node( int flags, int size, const char *name,
+ const method_t *methods, int nmet )
{
phandle_t save_ph = get_cur_dev();
Modified: openbios-devel/modules/sun-parts.c
===================================================================
--- openbios-devel/modules/sun-parts.c 2006-05-10 21:41:21 UTC (rev 15)
+++ openbios-devel/modules/sun-parts.c 2006-05-10 23:00:34 UTC (rev 16)
@@ -17,6 +17,13 @@
#include "libc/byteorder.h"
#include "modules.h"
+#ifdef CONFIG_DEBUG_SUN_PARTS
+#define DPRINTF(fmt, args...) \
+ do { printk(fmt , ##args); } while (0)
+#else
+#define DPRINTF(fmt, args...)
+#endif
+
typedef struct {
ullong offs;
ullong size;
@@ -88,7 +95,7 @@
struct sun_disklabel *p;
unsigned int i;
- printk("sunparts_open '%s'\n", str );
+ DPRINTF("sunparts_open '%s'\n", str );
if( str ) {
parnum = atol(str);
@@ -103,7 +110,7 @@
/* Check Magic */
if (!has_sun_part_magic(buf)) {
- printk("sun partition magic not found.\n");
+ DPRINTF("sun partition magic not found.\n");
RET(0);
}
@@ -111,7 +118,7 @@
p = (struct sun_disklabel *)buf;
for (i = 0; i < 8; i++) {
- printk("%c: %d + %d, id %x, flags %x\n", 'a' + i, p->partitions[i].start_cylinder,
+ DPRINTF("%c: %d + %d, id %x, flags %x\n", 'a' + i, p->partitions[i].start_cylinder,
p->partitions[i].num_sectors, p->infos[i].id, p->infos[i].flags);
if (parnum < 0) {
if (p->partitions[i].num_sectors != 0 && p->infos[i].id != 0)
@@ -122,7 +129,7 @@
__be16_to_cpu(p->ntrks) * __be16_to_cpu(p->nsect);
di->size = (llong)__be32_to_cpu(p->partitions[parnum].num_sectors) ;
- printk("Found Sun partition table, offs %d size %d\n", (int)di->offs, (int)di->size);
+ DPRINTF("Found Sun partition table, offs %d size %d\n", (int)di->offs, (int)di->size);
RET( -1 );
}