[OpenBIOS] r165 - openbios-devel/arch/sparc64

svn at openbios.org svn at openbios.org
Wed Jul 11 21:48:31 CEST 2007


Author: blueswirl
Date: 2007-07-11 21:48:31 +0200 (Wed, 11 Jul 2007)
New Revision: 165

Modified:
   openbios-devel/arch/sparc64/openbios.c
Log:
NVRAM support (temporary location)

Modified: openbios-devel/arch/sparc64/openbios.c
===================================================================
--- openbios-devel/arch/sparc64/openbios.c	2007-07-11 19:46:26 UTC (rev 164)
+++ openbios-devel/arch/sparc64/openbios.c	2007-07-11 19:48:31 UTC (rev 165)
@@ -21,17 +21,92 @@
 static unsigned char intdict[256 * 1024];
 
 // XXX
-void arch_nvram_put()
+#define NVRAM_SIZE       0x2000
+#define NVRAM_IDPROM     0x1fd0
+#define NVRAM_OB_OFFSET  256
+#define NVRAM_OB_SIZE    ((NVRAM_IDPROM - NVRAM_OB_OFFSET) & ~15)
+
+static struct qemu_nvram_v1 {
+    char id_string[16];
+    uint32_t version;
+    uint32_t nvram_size; // not used in Sun4m
+    char unused1[8];
+    char arch[12];
+    char curr_cpu;
+    char smp_cpus;
+    char unused2;
+    char nographic;
+    uint32_t ram_size;
+    char boot_device;
+    char unused3[3];
+    uint32_t kernel_image;
+    uint32_t kernel_size;
+    uint32_t cmdline;
+    uint32_t cmdline_size;
+    uint32_t initrd_image;
+    uint32_t initrd_size;
+    uint32_t nvram_image;
+    uint16_t width;
+    uint16_t height;
+    uint16_t depth;
+    char unused4[158];
+    uint16_t crc;
+} nv_info;
+
+#define OBIO_CMDLINE_MAX 256
+static char obio_cmdline[OBIO_CMDLINE_MAX];
+
+void arch_nvram_get(char *data)
 {
+    unsigned short i;
+    unsigned char *nvptr = &nv_info;
+    uint32_t size;
+    extern uint32_t kernel_image;
+    extern uint32_t kernel_size;
+    extern uint32_t cmdline;
+    extern uint32_t cmdline_size;
+    extern char boot_device;
+
+    for (i = 0; i < sizeof(struct qemu_nvram_v1); i++) {
+        outb(i & 0xff, 0x74);
+        outb(i  >> 8, 0x75);
+        *nvptr++ = inb(0x77);
+    }
+
+    kernel_image = nv_info.kernel_image;
+    kernel_size = nv_info.kernel_size;
+    size = nv_info.cmdline_size;
+    if (size > OBIO_CMDLINE_MAX - 1)
+        size = OBIO_CMDLINE_MAX - 1;
+    memcpy(obio_cmdline, nv_info.cmdline, size);
+    obio_cmdline[size] = '\0';
+    cmdline = obio_cmdline;
+    cmdline_size = size;
+    printk("kernel addr %x size %x\n", kernel_image, kernel_size);
+    if (size)
+        printk("kernel cmdline %s\n", obio_cmdline);
+
+    for (i = 0; i < NVRAM_OB_SIZE; i++) {
+        outb((i + NVRAM_OB_OFFSET) & 0xff, 0x74);
+        outb((i + NVRAM_OB_OFFSET) >> 8, 0x75);
+        data[i] = inb(0x77);
+    }
 }
 
-void arch_nvram_get()
+void arch_nvram_put(char *data)
 {
+    unsigned short i;
+
+    for (i = 0; i < NVRAM_OB_SIZE; i++) {
+        outb((i + NVRAM_OB_OFFSET) & 0xff, 0x74);
+        outb((i + NVRAM_OB_OFFSET) >> 8, 0x75);
+        outb(data[i], 0x77);
+    }
 }
 
 int arch_nvram_size()
 {
-    return 8192;
+    return NVRAM_OB_SIZE;
 }
 
 void setup_timers()
@@ -132,6 +207,9 @@
 
 	enterforth((xt_t)PC);
         arch_init(); // XXX
+        printk("force boot\n");
+        push_str("/pci/isa/ide0/disk at 0,0:a");
+        boot(); // XXX
         printk("falling off...\n");
 	return 0;
 }




More information about the OpenBIOS mailing list