[OpenBIOS] r16 - in openbios-devel: arch/sparc32 config/examples drivers include/openbios include/sparc32 libc modules

svn@openbios.org svn at openbios.org
Thu May 11 01:00:35 CEST 2006


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 at 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 at 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 );
 }





More information about the OpenBIOS mailing list