[OpenBIOS] r71 - in openbios-devel: arch/sparc32 drivers modules

svn@openbios.org svn at openbios.org
Sun Jul 23 16:29:30 CEST 2006


Author: stepan
Date: 2006-07-23 16:29:29 +0200 (Sun, 23 Jul 2006)
New Revision: 71

Modified:
   openbios-devel/arch/sparc32/aoutload.c
   openbios-devel/arch/sparc32/boot.c
   openbios-devel/arch/sparc32/boot.h
   openbios-devel/arch/sparc32/console.c
   openbios-devel/arch/sparc32/elfload.c
   openbios-devel/arch/sparc32/linux_load.c
   openbios-devel/arch/sparc32/romvec.c
   openbios-devel/arch/sparc32/tree.fs
   openbios-devel/drivers/obio.c
   openbios-devel/modules/video.c
Log:
blueswirl's latest console-nographic.diff.bz2


Modified: openbios-devel/arch/sparc32/aoutload.c
===================================================================
--- openbios-devel/arch/sparc32/aoutload.c	2006-07-23 14:22:39 UTC (rev 70)
+++ openbios-devel/arch/sparc32/aoutload.c	2006-07-23 14:29:29 UTC (rev 71)
@@ -51,7 +51,8 @@
     return 0;
 }
 
-int aout_load(struct sys_info *info, const char *filename, const char *cmdline)
+int aout_load(struct sys_info *info, const char *filename, const char *cmdline,
+              const void *romvec)
 {
     int retval = -1;
     int image_retval;
@@ -126,14 +127,8 @@
 
 #if 1
     {
-        extern unsigned int qemu_mem_size;
-        extern char boot_device;
-        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, cmdline, boot_device);
         entry = (void *) addr_fixup(start);
         image_retval = entry(romvec, 0, 0, 0, 0);
     }

Modified: openbios-devel/arch/sparc32/boot.c
===================================================================
--- openbios-devel/arch/sparc32/boot.c	2006-07-23 14:22:39 UTC (rev 70)
+++ openbios-devel/arch/sparc32/boot.c	2006-07-23 14:29:29 UTC (rev 71)
@@ -8,10 +8,11 @@
 #include "openbios/nvram.h"
 #include "libc/diskio.h"
 #include "sys_info.h"
+#include "openprom.h"
 
-int elf_load(struct sys_info *, const char *filename, const char *cmdline);
-int aout_load(struct sys_info *, const char *filename, const char *cmdline);
-int linux_load(struct sys_info *, const char *filename, const char *cmdline);
+int elf_load(struct sys_info *, const char *filename, const char *cmdline, const void *romvec);
+int aout_load(struct sys_info *, const char *filename, const char *cmdline, const void *romvec);
+int linux_load(struct sys_info *, const char *filename, const char *cmdline, const void *romvec);
 
 void boot(void);
 
@@ -21,43 +22,54 @@
 uint32_t cmdline;
 uint32_t cmdline_size;
 char boot_device;
+extern unsigned int qemu_mem_size;
+void *init_openprom(unsigned long memsize);
+extern struct linux_arguments_v0 obp_arg;
 
 void boot(void)
 {
-	char *path=pop_fstr_copy(), *param;
+        char *path = pop_fstr_copy(), *param, *oldpath;
         char altpath[256];
-	
-        if (kernel_size) {
-            extern unsigned int qemu_mem_size;
-            void *init_openprom(unsigned long memsize, const char *cmdline, char boot_device);
+        int unit;
+        const void *romvec;
 
-            int (*entry)(const void *romvec, int p2, int p3, int p4, int p5);
-            const void *romvec;
-
-            printk("[sparc] Kernel already loaded\n");
-            romvec = init_openprom(qemu_mem_size, (void *)cmdline, boot_device);
-            entry = (void *) kernel_image;
-            entry(romvec, 0, 0, 0, 0);
-        }
-
 	if(!path) {
             switch(boot_device) {
             case 'a':
                 path = "/obio/SUNW,fdtwo";
+                oldpath = "fd()";
+                unit = 0;
                 break;
             case 'c':
                 path = "disk";
+                oldpath = "sd(0,0,0):d";
+                unit = 0;
                 break;
             default:
             case 'd':
                 path = "cdrom";
+                // FIXME: hardcoding this looks almost definitely wrong.
+                // With sd(0,2,0):b we get to see the solaris kernel though
+                //oldpath = "sd(0,2,0):d";
+                oldpath = "sd(0,2,0):b";
+                unit = 2;
                 break;
             case 'n':
                 path = "net";
+                oldpath = "le()";
+                unit = 0;
                 break;
             }
 	}
 
+        obp_arg.boot_dev_ctrl = 0;
+        obp_arg.boot_dev_unit = unit;
+        obp_arg.dev_partition = 0;
+        obp_arg.boot_dev[0] = oldpath[0];
+        obp_arg.boot_dev[1] = oldpath[1];
+        obp_arg.argv[0] = oldpath;
+        obp_arg.argv[1] = cmdline;
+
 	param = strchr(path, ' ');
 	if(param) {
 		*param = '\0';
@@ -66,22 +78,31 @@
             param = (char *)cmdline;
         }
 	
+        romvec = init_openprom(qemu_mem_size);
+
+        if (kernel_size) {
+            int (*entry)(const void *romvec, int p2, int p3, int p4, int p5);
+
+            printk("[sparc] Kernel already loaded\n");
+            entry = (void *) kernel_image;
+            entry(romvec, 0, 0, 0, 0);
+        }
+
 	printk("[sparc] Booting file '%s' ", path);
 	if(param) 
 		printk("with parameters '%s'\n", param);
 	else
 		printk("without parameters.\n");
 
+	if (elf_load(&sys_info, path, param, romvec) == LOADER_NOT_SUPPORT)
+            if (linux_load(&sys_info, path, param, romvec) == LOADER_NOT_SUPPORT)
+                if (aout_load(&sys_info, path, param, romvec) == LOADER_NOT_SUPPORT) {
 
-	if (elf_load(&sys_info, path, param) == LOADER_NOT_SUPPORT)
-            if (linux_load(&sys_info, path, param) == LOADER_NOT_SUPPORT)
-                if (aout_load(&sys_info, path, param) == LOADER_NOT_SUPPORT) {
-
                     sprintf(altpath, "%s:d", path);
 
-                    if (elf_load(&sys_info, altpath, param) == LOADER_NOT_SUPPORT)
-                        if (linux_load(&sys_info, altpath, param) == LOADER_NOT_SUPPORT)
-                            if (aout_load(&sys_info, altpath, param) == LOADER_NOT_SUPPORT)
+                    if (elf_load(&sys_info, altpath, param, romvec) == LOADER_NOT_SUPPORT)
+                        if (linux_load(&sys_info, altpath, param, romvec) == LOADER_NOT_SUPPORT)
+                            if (aout_load(&sys_info, altpath, param, romvec) == LOADER_NOT_SUPPORT)
                                 printk("Unsupported image format\n");
                 }
 

Modified: openbios-devel/arch/sparc32/boot.h
===================================================================
--- openbios-devel/arch/sparc32/boot.h	2006-07-23 14:22:39 UTC (rev 70)
+++ openbios-devel/arch/sparc32/boot.h	2006-07-23 14:29:29 UTC (rev 71)
@@ -7,8 +7,11 @@
  */
 
 int forth_load(struct sys_info *info, const char *filename, const char *cmdline);
-int elf_load(struct sys_info *info, const char *filename, const char *cmdline);
-int linux_load(struct sys_info *info, const char *file, const char *cmdline);
+int elf_load(struct sys_info *, const char *filename, const char *cmdline,
+             const void *romvec);
+int aout_load(struct sys_info *, const char *filename, const char *cmdline,
+              const void *romvec);
+int linux_load(struct sys_info *, const char *filename, const char *cmdline,
+               const void *romvec);
 
 unsigned int start_elf(unsigned long entry_point, unsigned long param);
-

Modified: openbios-devel/arch/sparc32/console.c
===================================================================
--- openbios-devel/arch/sparc32/console.c	2006-07-23 14:22:39 UTC (rev 70)
+++ openbios-devel/arch/sparc32/console.c	2006-07-23 14:29:29 UTC (rev 71)
@@ -192,13 +192,13 @@
 
 static int shiftstate;
 
-static int
+int
 keyboard_dataready(void)
 {
     return ((inb(KBD_BASE) & 1) == 1);
 }
 
-static unsigned char
+unsigned char
 keyboard_readdata(void)
 {
     unsigned char ch;

Modified: openbios-devel/arch/sparc32/elfload.c
===================================================================
--- openbios-devel/arch/sparc32/elfload.c	2006-07-23 14:22:39 UTC (rev 70)
+++ openbios-devel/arch/sparc32/elfload.c	2006-07-23 14:29:29 UTC (rev 71)
@@ -302,7 +302,8 @@
     return bhdr;
 }
 
-int elf_load(struct sys_info *info, const char *filename, const char *cmdline)
+int elf_load(struct sys_info *info, const char *filename, const char *cmdline,
+             const void *romvec)
 {
     Elf_ehdr ehdr;
     Elf_phdr *phdr = NULL;
@@ -383,14 +384,8 @@
 
 #if 1
     {
-        extern unsigned int qemu_mem_size;
-        extern char boot_device;
-        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, cmdline, boot_device);
         entry = (void *) addr_fixup(ehdr.e_entry);
         image_retval = entry(romvec, 0, 0, 0, 0);
     }

Modified: openbios-devel/arch/sparc32/linux_load.c
===================================================================
--- openbios-devel/arch/sparc32/linux_load.c	2006-07-23 14:22:39 UTC (rev 70)
+++ openbios-devel/arch/sparc32/linux_load.c	2006-07-23 14:29:29 UTC (rev 71)
@@ -578,7 +578,8 @@
     return ctx->regs[REG_O0];
 }
 
-int linux_load(struct sys_info *info, const char *file, const char *cmdline)
+int linux_load(struct sys_info *info, const char *file, const char *cmdline,
+               const void *romvec)
 {
     struct linux_header hdr;
     struct linux_params *params;

Modified: openbios-devel/arch/sparc32/romvec.c
===================================================================
--- openbios-devel/arch/sparc32/romvec.c	2006-07-23 14:22:39 UTC (rev 70)
+++ openbios-devel/arch/sparc32/romvec.c	2006-07-23 14:29:29 UTC (rev 71)
@@ -33,8 +33,9 @@
 static struct linux_mlist_v0 *ptphys;
 static struct linux_mlist_v0 *ptmap;
 static struct linux_mlist_v0 *ptavail;
-static char obp_stdin, obp_stdout;
+char obp_stdin, obp_stdout;
 static int obp_fd_stdin, obp_fd_stdout;
+const char *obp_stdin_path, *obp_stdout_path;
 
 static int obp_nextnode(int node);
 static int obp_child(int node);
@@ -45,7 +46,7 @@
 static int obp_devread(int dev_desc, char *buf, int nbytes);
 static int obp_devseek(int dev_desc, int hi, int lo);
 
-static struct linux_arguments_v0 obp_arg;
+struct linux_arguments_v0 obp_arg;
 static const struct linux_arguments_v0 * const obp_argp = &obp_arg;
 
 static void (*sync_hook)(void);
@@ -444,7 +445,7 @@
 }
 
 void *
-init_openprom(unsigned long memsize, const char *cmdline, char boot_device)
+init_openprom(unsigned long memsize)
 {
     free_ram = va2pa((int)&_data) - PAGE_SIZE;
 
@@ -503,50 +504,17 @@
     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.dev_partition = 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;
-	// FIXME: hardcoding this looks almost definitely wrong.
-	// With sd(0,2,0):b we get to see the solaris kernel though
-        //obp_arg.argv[0] = "sd(0,2,0):d";
-        obp_arg.argv[0] = "sd(0,2,0):b";
-        // 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 = &obp_arg.argv[1];
     romvec0.pv_v2bootargs.fd_stdin = &obp_fd_stdin;
     romvec0.pv_v2bootargs.fd_stdout = &obp_fd_stdout;
 
-    push_str("/builtin/console");
+    push_str(obp_stdin_path);
     fword("open-dev");
     obp_fd_stdin = POP();
-    push_str("/builtin/console");
+    push_str(obp_stdout_path);
     fword("open-dev");
     obp_fd_stdout = POP();
-    
-    obp_stdin = PROMDEV_TTYA;
-    obp_stdout = PROMDEV_TTYA;
 
     romvec0.v3_cpustart = obp_cpustart;
     romvec0.v3_cpustop = obp_cpustop;

Modified: openbios-devel/arch/sparc32/tree.fs
===================================================================
--- openbios-devel/arch/sparc32/tree.fs	2006-07-23 14:22:39 UTC (rev 70)
+++ openbios-devel/arch/sparc32/tree.fs	2006-07-23 14:29:29 UTC (rev 71)
@@ -9,10 +9,6 @@
   " SUNW,501-3059" encode-string " model" property
   h# 0a21fe80 encode-int " clock-frequency" property
   
-  " /obio/zs at 0,100000:a" encode-string " stdin-path" property
-  " /obio/zs at 0,100000:a" encode-string " stdout-path" property
-
-  
   : encode-unit encode-unit-sbus ;
   : decode-unit decode-unit-sbus ;
 

Modified: openbios-devel/drivers/obio.c
===================================================================
--- openbios-devel/drivers/obio.c	2006-07-23 14:22:39 UTC (rev 70)
+++ openbios-devel/drivers/obio.c	2006-07-23 14:29:29 UTC (rev 71)
@@ -25,7 +25,18 @@
 			path, name##_m, sizeof(name##_m)/sizeof(method_t)); \
 	} while(0)
 
+#define REGISTER_NODE_METHODS( name, path )   do {                      \
+        const char *paths[1];                                                  \
+                                                                        \
+        paths[0] = path;                                                \
+        bind_node( name##_flags_, name##_size_,                         \
+                   paths, 1, name##_m, sizeof(name##_m)/sizeof(method_t)); \
+    } while(0)
 
+#define	PROMDEV_KBD	0		/* input from keyboard */
+#define	PROMDEV_SCREEN	0		/* output to screen */
+#define	PROMDEV_TTYA	1		/* in/out to ttya */
+
 /* DECLARE data structures for the nodes.  */
 DECLARE_UNNAMED_NODE( ob_obio, INSTALL_OPEN, sizeof(int) );
 
@@ -88,10 +99,145 @@
     fword("property");
 }
 
+// XXX move all arch/sparc32/console.c stuff here
+#define CTRL(addr) (*(char *)(addr))
+#define DATA(addr) (*(char *)(addr + 2))
 
+/* Read Register 0 */
+#define	Rx_CH_AV	0x1	/* Rx Character Available */
+#define	Tx_BUF_EMP	0x4	/* Tx Buffer empty */
+
+static int uart_charav(int port)
+{
+    return (CTRL(port) & Rx_CH_AV) != 0;
+}
+
+static char uart_getchar(int port)
+{
+    while (!uart_charav(port));
+
+    return DATA(port) & 0177;
+}
+
+static void uart_putchar(int port, unsigned char c)
+{
+	if (c == '\n')
+		uart_putchar(port, '\r');
+	while (!(CTRL(port) & Tx_BUF_EMP));
+
+        DATA(port) = c;
+}
+
+/* ( addr len -- actual ) */
 static void
+zs_read(unsigned long *address)
+{
+    char *addr;
+    int len;
+
+    len = POP();
+    addr = (char *)POP();
+
+    if (len != 1)
+        printk("zs_read: bad len, addr %x len %x\n", (unsigned int)addr, len);
+
+    if (uart_charav(*address)) {
+        *addr = (char)uart_getchar(*address);
+        PUSH(1);
+    } else {
+        PUSH(0);
+    }
+}
+
+int keyboard_dataready(void);
+unsigned char keyboard_readdata(void);
+
+/* ( addr len -- actual ) */
+static void
+zs_read_keyboard(unsigned long *address)
+{
+    unsigned char *addr;
+    int len;
+
+    len = POP();
+    addr = (unsigned char *)POP();
+
+    if (len != 1)
+        printk("zs_read: bad len, addr %x len %x\n", (unsigned int)addr, len);
+
+    if (keyboard_dataready()) {
+        *addr = keyboard_readdata();
+        PUSH(1);
+    } else {
+        PUSH(0);
+    }
+}
+
+/* ( addr len -- actual ) */
+static void
+zs_write(unsigned long *address)
+{
+    unsigned char *addr;
+    int i, len;
+
+    len = POP();
+    addr = (unsigned char *)POP();
+
+     for (i = 0; i < len; i++) {
+        uart_putchar(*address, addr[i]);
+    }
+    PUSH(len);
+}
+
+static void
+zs_close(void)
+{
+}
+
+static void
+zs_open(unsigned long *address)
+{
+    int len;
+    phandle_t ph;
+    unsigned long *prop;
+    char *args;
+
+    fword("my-self");
+    fword("ihandle>phandle");
+    ph = (phandle_t)POP();
+    prop = (unsigned long *)get_property(ph, "address", &len);
+    *address = *prop;
+    fword("my-args");
+    args = pop_fstr_copy();
+    if (args && args[0] == 'a')
+        *address += 4;
+
+    //printk("zs_open: address %lx, args %s\n", *address, args);
+    RET ( -1 );
+}
+
+DECLARE_UNNAMED_NODE(zs, INSTALL_OPEN, sizeof(unsigned long));
+
+NODE_METHODS(zs) = {
+	{ "open",               zs_open              },
+	{ "close",              zs_close             },
+	{ "read",               zs_read              },
+	{ "write",              zs_write             },
+};
+
+DECLARE_UNNAMED_NODE(zs_keyboard, INSTALL_OPEN, sizeof(unsigned long));
+
+NODE_METHODS(zs_keyboard) = {
+	{ "open",               zs_open              },
+	{ "close",              zs_close             },
+	{ "read",               zs_read_keyboard     },
+};
+
+static void
 ob_zs_init(unsigned long base, unsigned long offset, int intr, int slave, int keyboard)
 {
+    char nodebuff[256];
+
     ob_new_obio_device("zs", "serial");
 
     ob_reg(base, offset, ZS_REGS, 1);
@@ -116,6 +262,13 @@
     ob_intr(intr);
 
     fword("finish-device");
+
+    sprintf(nodebuff, "/obio/zs at 0,%x", offset);
+    if (keyboard) {
+        REGISTER_NODE_METHODS(zs_keyboard, nodebuff);
+    } else {
+        REGISTER_NODE_METHODS(zs, nodebuff);
+    }
 }
 
 static char *nvram;
@@ -147,8 +300,12 @@
     extern uint32_t cmdline;
     extern uint32_t cmdline_size;
     extern char boot_device;
+    extern char obp_stdin, obp_stdout;
+    extern const char *obp_stdin_path, *obp_stdout_path;
 
+    const char *stdin, *stdout;
     unsigned int i;
+    char nographic;
 
     ob_new_obio_device("eeprom", NULL);
 
@@ -171,6 +328,7 @@
     cmdline = nv_info.cmdline;
     cmdline_size = nv_info.cmdline_size;
     boot_device = nv_info.boot_device;
+    nographic = nv_info.nographic;
 
     push_str("mk48t08");
     fword("model");
@@ -301,6 +459,35 @@
 	
         fword("finish-device");
     }
+
+    if (nographic) {
+        obp_stdin = PROMDEV_TTYA;
+        obp_stdout = PROMDEV_TTYA;
+        stdin = "/obio/zs at 0,100000:a";
+        stdout = "/obio/zs at 0,100000:a";
+    } else {
+        obp_stdin = PROMDEV_KBD;
+        obp_stdout = PROMDEV_SCREEN;
+        stdin = "/obio/zs at 0,0:a";
+        stdout = "/iommu/sbus/SUNW,tcx";
+    }
+
+    push_str("/");
+    fword("find-device");
+    push_str(stdin);
+    fword("encode-string");
+    push_str("stdin-path");
+    fword("encode-string");
+    fword("property");
+
+    push_str(stdout);
+    fword("encode-string");
+    push_str("stdout-path");
+    fword("encode-string");
+    fword("property");
+
+    obp_stdin_path = stdin;
+    obp_stdout_path = stdout;
 }
 
 static void

Modified: openbios-devel/modules/video.c
===================================================================
--- openbios-devel/modules/video.c	2006-07-23 14:22:39 UTC (rev 70)
+++ openbios-devel/modules/video.c	2006-07-23 14:29:29 UTC (rev 71)
@@ -242,11 +242,32 @@
 	fill_rect( color_ind, x, y, w, h );
 }
 
+/* ( addr len -- actual ) */
+static void
+video_write(void)
+{
+    char *addr;
+    int i, len;
+
+    len = GETTOS();
+    addr = pop_fstr_copy();
+
+    console_draw_str(addr);
+    PUSH(len);
+}
+
+static void
+video_open(void)
+{
+}
+
 NODE_METHODS( video ) = {
+	{"open",		video_open		},
 	{"dimensions",		video_dimensions	},
 	{"set-colors",		video_set_colors	},
 	{"fill-rectangle",	video_fill_rect		},
 	{"color!",		video_color_bang	},
+	{"write",		video_write		},
 };
 
 




More information about the OpenBIOS mailing list