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

svn at openbios.org svn at openbios.org
Sun Jan 4 13:53:26 CET 2009


Author: blueswirl
Date: 2009-01-04 13:53:26 +0100 (Sun, 04 Jan 2009)
New Revision: 346

Modified:
   openbios-devel/arch/sparc64/boot.h
   openbios-devel/arch/sparc64/lib.c
   openbios-devel/arch/sparc64/openbios.c
Log:
Clean up Sparc64 memory management

Concentrate memory and MMU management (lib.c malloc, OF /memory) to lib.c.


Modified: openbios-devel/arch/sparc64/boot.h
===================================================================
--- openbios-devel/arch/sparc64/boot.h	2009-01-03 13:46:15 UTC (rev 345)
+++ openbios-devel/arch/sparc64/boot.h	2009-01-04 12:53:26 UTC (rev 346)
@@ -39,3 +39,6 @@
 
 // console.c
 void ob_su_init(uint64_t base, uint64_t offset, int intr);
+
+// lib.c
+void ob_mmu_init(const char *cpuname, uint64_t ram_size);

Modified: openbios-devel/arch/sparc64/lib.c
===================================================================
--- openbios-devel/arch/sparc64/lib.c	2009-01-03 13:46:15 UTC (rev 345)
+++ openbios-devel/arch/sparc64/lib.c	2009-01-04 12:53:26 UTC (rev 346)
@@ -8,11 +8,11 @@
  */
 
 #include "openbios/config.h"
-#include "asm/types.h"
-#include <stdarg.h>
-#include "libc/stdlib.h"
 #include "libc/vsprintf.h"
-#include "openbios/kernel.h"
+#include "openbios/bindings.h"
+#include "spitfire.h"
+#include "sys_info.h"
+#include "boot.h"
 
 /* Format a string and print it on the screen, just like the libc
  * function printf.
@@ -59,3 +59,449 @@
 {
 	/* Nothing yet */
 }
+
+#define PAGE_SIZE_4M   (4 * 1024 * 1024)
+#define PAGE_SIZE_512K (512 * 1024)
+#define PAGE_SIZE_64K  (64 * 1024)
+#define PAGE_SIZE_8K   (8 * 1024)
+#define PAGE_MASK_4M   (4 * 1024 * 1024 - 1)
+#define PAGE_MASK_512K (512 * 1024 - 1)
+#define PAGE_MASK_64K  (64 * 1024 - 1)
+#define PAGE_MASK_8K   (8 * 1024 - 1)
+
+static void
+mmu_open(void)
+{
+    RET(-1);
+}
+
+static void
+mmu_close(void)
+{
+}
+
+static int
+spitfire_translate(unsigned long virt, unsigned long *p_phys,
+                   unsigned long *p_data, unsigned long *p_size)
+{
+    unsigned long phys, tag, data, mask, size;
+    unsigned int i;
+
+    for (i = 0; i < 64; i++) {
+        data = spitfire_get_dtlb_data(i);
+        if (data & 0x8000000000000000ULL) { // Valid entry?
+            switch ((data >> 61) & 3) {
+            default:
+            case 0x0: // 8k
+                mask = 0xffffffffffffe000ULL;
+                size = PAGE_SIZE_8K;
+                break;
+            case 0x1: // 64k
+                mask = 0xffffffffffff0000ULL;
+                size = PAGE_SIZE_64K;
+                break;
+            case 0x2: // 512k
+                mask = 0xfffffffffff80000ULL;
+                size = PAGE_SIZE_512K;
+                break;
+            case 0x3: // 4M
+                mask = 0xffffffffffc00000ULL;
+                size = PAGE_SIZE_4M;
+                break;
+            }
+            tag = spitfire_get_dtlb_tag(i);
+            if ((virt & mask) == (tag & mask)) {
+                phys = data & mask & 0x000001fffffff000ULL;
+                phys |= virt & ~mask;
+                *p_phys = phys;
+                *p_data = data & 0xfff;
+                *p_size = size;
+                return -1;
+            }
+        }
+    }
+
+    return 0;
+}
+
+/*
+  3.6.5 translate
+  ( virt -- false | phys.lo ... phys.hi mode true )
+*/
+static void
+mmu_translate(void)
+{
+    unsigned long virt, phys, data, size;
+
+    virt = POP();
+
+    if (spitfire_translate(virt, &phys, &data, &size)) {
+        PUSH(phys & 0xffffffff);
+        PUSH(phys >> 32);
+        PUSH(data);
+        PUSH(-1);
+        return;
+    }
+    PUSH(0);
+}
+
+static void
+dtlb_load2(unsigned long vaddr, unsigned long tte_data)
+{
+    asm("stxa %0, [%1] %2\n"
+        "stxa %3, [%%g0] %4\n"
+        : : "r" (vaddr), "r" (48), "i" (ASI_DMMU),
+          "r" (tte_data), "i" (ASI_DTLB_DATA_IN));
+}
+
+static void
+dtlb_load3(unsigned long vaddr, unsigned long tte_data,
+           unsigned long tte_index)
+{
+    asm("stxa %0, [%1] %2\n"
+        "stxa %3, [%4] %5\n"
+        : : "r" (vaddr), "r" (48), "i" (ASI_DMMU),
+          "r" (tte_data), "r" (tte_index << 3), "i" (ASI_DTLB_DATA_ACCESS));
+}
+
+/*
+  ( index tte_data vaddr -- ? )
+*/
+static void
+dtlb_load(void)
+{
+    unsigned long vaddr, tte_data, idx;
+
+    vaddr = POP();
+    tte_data = POP();
+    idx = POP();
+    dtlb_load3(vaddr, tte_data, idx);
+}
+
+static void
+itlb_load2(unsigned long vaddr, unsigned long tte_data)
+{
+    asm("stxa %0, [%1] %2\n"
+        "stxa %3, [%%g0] %4\n"
+        : : "r" (vaddr), "r" (48), "i" (ASI_IMMU),
+          "r" (tte_data), "i" (ASI_ITLB_DATA_IN));
+}
+
+static void
+itlb_load3(unsigned long vaddr, unsigned long tte_data,
+           unsigned long tte_index)
+{
+    asm("stxa %0, [%1] %2\n"
+        "stxa %3, [%4] %5\n"
+        : : "r" (vaddr), "r" (48), "i" (ASI_IMMU),
+          "r" (tte_data), "r" (tte_index << 3), "i" (ASI_ITLB_DATA_ACCESS));
+}
+
+/*
+  ( index tte_data vaddr -- ? )
+*/
+static void
+itlb_load(void)
+{
+    unsigned long vaddr, tte_data, idx;
+
+    vaddr = POP();
+    tte_data = POP();
+    idx = POP();
+    itlb_load3(vaddr, tte_data, idx);
+}
+
+static void
+map_pages(unsigned long virt, unsigned long size, unsigned long phys)
+{
+    unsigned long tte_data, currsize;
+
+    size = (size + PAGE_MASK_8K) & ~PAGE_MASK_8K;
+    while (size >= PAGE_SIZE_8K) {
+        currsize = size;
+        if (currsize >= PAGE_SIZE_4M &&
+            (virt & PAGE_MASK_4M) == 0 &&
+            (phys & PAGE_MASK_4M) == 0) {
+            currsize = PAGE_SIZE_4M;
+            tte_data = 6ULL << 60;
+        } else if (currsize >= PAGE_SIZE_512K &&
+                   (virt & PAGE_MASK_512K) == 0 &&
+                   (phys & PAGE_MASK_512K) == 0) {
+            currsize = PAGE_SIZE_512K;
+            tte_data = 4ULL << 60;
+        } else if (currsize >= PAGE_SIZE_64K &&
+                   (virt & PAGE_MASK_64K) == 0 &&
+                   (phys & PAGE_MASK_64K) == 0) {
+            currsize = PAGE_SIZE_64K;
+            tte_data = 2ULL << 60;
+        } else {
+            currsize = PAGE_SIZE_8K;
+            tte_data = 0;
+        }
+        tte_data |= phys | 0x8000000000000036ULL;
+        dtlb_load2(virt, tte_data);
+        itlb_load2(virt, tte_data);
+        size -= currsize;
+        phys += currsize;
+        virt += currsize;
+    }
+}
+
+/*
+  3.6.5 map
+  ( phys.lo ... phys.hi virt size mode -- )
+*/
+static void
+mmu_map(void)
+{
+    unsigned long virt, size, mode, phys;
+
+    mode = POP();
+    size = POP();
+    virt = POP();
+    phys = POP();
+    phys <<= 32;
+    phys |= POP();
+    map_pages(virt, size, phys);
+}
+
+static void
+itlb_demap(unsigned long vaddr)
+{
+    asm("stxa %0, [%0] %1\n"
+        : : "r" (vaddr), "i" (ASI_IMMU_DEMAP));
+}
+
+static void
+dtlb_demap(unsigned long vaddr)
+{
+    asm("stxa %0, [%0] %1\n"
+        : : "r" (vaddr), "i" (ASI_DMMU_DEMAP));
+}
+
+static void
+unmap_pages(unsigned long virt, unsigned long size)
+{
+    unsigned long phys, data;
+
+    unsigned long currsize;
+
+    // align size
+    size = (size + PAGE_MASK_8K) & ~PAGE_MASK_8K;
+
+    while (spitfire_translate(virt, &phys, &data, &currsize)) {
+
+        itlb_demap(virt & ~0x1fffULL);
+        dtlb_demap(virt & ~0x1fffULL);
+
+        size -= currsize;
+        virt += currsize;
+    }
+}
+
+/*
+  3.6.5 unmap
+  ( virt size -- )
+*/
+static void
+mmu_unmap(void)
+{
+    unsigned long virt, size;
+
+    size = POP();
+    virt = POP();
+    unmap_pages(virt, size);
+}
+
+/*
+  3.6.5 claim
+  ( virt size align -- base )
+*/
+static void
+mmu_claim(void)
+{
+    unsigned long virt, size, align;
+
+    align = POP();
+    size = POP();
+    virt = POP();
+    PUSH(virt); // XXX
+}
+
+/*
+  3.6.5 release
+  ( virt size -- )
+*/
+static void
+mmu_release(void)
+{
+    unsigned long virt, size;
+
+    size = POP();
+    virt = POP();
+    // XXX
+}
+
+DECLARE_UNNAMED_NODE(mmu, INSTALL_OPEN, 0);
+
+NODE_METHODS(mmu) = {
+    { "open",               mmu_open              },
+    { "close",              mmu_close             },
+    { "translate",          mmu_translate         },
+    { "SUNW,dtlb-load",     dtlb_load             },
+    { "SUNW,itlb-load",     itlb_load             },
+    { "map",                mmu_map               },
+    { "unmap",              mmu_unmap             },
+    { "claim",              mmu_claim             },
+    { "release",            mmu_release           },
+};
+
+void ob_mmu_init(const char *cpuname, uint64_t ram_size)
+{
+    char nodebuff[256];
+
+    // MMU node
+    snprintf(nodebuff, sizeof(nodebuff), "/%s", cpuname);
+    push_str(nodebuff);
+    fword("find-device");
+
+    fword("new-device");
+
+    push_str("mmu");
+    fword("device-name");
+
+    fword("finish-device");
+
+    snprintf(nodebuff, sizeof(nodebuff), "/%s/mmu", cpuname);
+
+    REGISTER_NODE_METHODS(mmu, nodebuff);
+
+    push_str("/chosen");
+    fword("find-device");
+
+    push_str(nodebuff);
+    fword("open-dev");
+    fword("encode-int");
+    push_str("mmu");
+    fword("property");
+
+    push_str("/memory");
+    fword("find-device");
+
+    // All memory: 0 to RAM_size
+    PUSH(0);
+    fword("encode-int");
+    PUSH(0);
+    fword("encode-int");
+    fword("encode+");
+    PUSH((int)(ram_size >> 32));
+    fword("encode-int");
+    fword("encode+");
+    PUSH((int)(ram_size & 0xffffffff));
+    fword("encode-int");
+    fword("encode+");
+    push_str("reg");
+    fword("property");
+
+    // Available memory: 0 to va2pa(_start)
+    PUSH(0);
+    fword("encode-int");
+    PUSH(0);
+    fword("encode-int");
+    fword("encode+");
+    PUSH((va2pa((unsigned long)&_data) - 8192) >> 32);
+    fword("encode-int");
+    fword("encode+");
+    PUSH((va2pa((unsigned long)&_data) - 8192) & 0xffffffff);
+    fword("encode-int");
+    fword("encode+");
+    push_str("available");
+    fword("property");
+
+    // XXX
+    // Translations
+    push_str("/virtual-memory");
+    fword("find-device");
+
+    // 0 to 16M: 1:1
+    PUSH(0);
+    fword("encode-int");
+    PUSH(0);
+    fword("encode-int");
+    fword("encode+");
+    PUSH(0);
+    fword("encode-int");
+    fword("encode+");
+    PUSH(16 * 1024 * 1024);
+    fword("encode-int");
+    fword("encode+");
+    PUSH(0x80000000);
+    fword("encode-int");
+    fword("encode+");
+    PUSH(0x00000036);
+    fword("encode-int");
+    fword("encode+");
+
+    // _start to _data: ROM used
+    PUSH(0);
+    fword("encode-int");
+    fword("encode+");
+    PUSH((unsigned long)&_start);
+    fword("encode-int");
+    fword("encode+");
+    PUSH(0);
+    fword("encode-int");
+    fword("encode+");
+    PUSH((unsigned long)&_data - (unsigned long)&_start);
+    fword("encode-int");
+    fword("encode+");
+    PUSH(0x800001ff);
+    fword("encode-int");
+    fword("encode+");
+    PUSH(0xf0000074);
+    fword("encode-int");
+    fword("encode+");
+
+    // _data to _end: end of RAM
+    PUSH(0);
+    fword("encode-int");
+    fword("encode+");
+    PUSH((unsigned long)&_data);
+    fword("encode-int");
+    fword("encode+");
+    PUSH(0);
+    fword("encode-int");
+    fword("encode+");
+    PUSH((unsigned long)&_data - (unsigned long)&_start);
+    fword("encode-int");
+    fword("encode+");
+    PUSH(((va2pa((unsigned long)&_data) - 8192) >> 32) | 0x80000000);
+    fword("encode-int");
+    fword("encode+");
+    PUSH(((va2pa((unsigned long)&_data) - 8192) & 0xffffffff) | 0x36);
+    fword("encode-int");
+    fword("encode+");
+
+    // VGA buffer (128k): 1:1
+    PUSH(0x1ff);
+    fword("encode-int");
+    fword("encode+");
+    PUSH(0x004a0000);
+    fword("encode-int");
+    fword("encode+");
+    PUSH(0);
+    fword("encode-int");
+    fword("encode+");
+    PUSH(128 * 1024);
+    fword("encode-int");
+    fword("encode+");
+    PUSH(0x800001ff);
+    fword("encode-int");
+    fword("encode+");
+    PUSH(0x004a0076);
+    fword("encode-int");
+    fword("encode+");
+
+    push_str("translations");
+    fword("property");
+}

Modified: openbios-devel/arch/sparc64/openbios.c
===================================================================
--- openbios-devel/arch/sparc64/openbios.c	2009-01-03 13:46:15 UTC (rev 345)
+++ openbios-devel/arch/sparc64/openbios.c	2009-01-04 12:53:26 UTC (rev 346)
@@ -9,10 +9,7 @@
 #include "openbios/config.h"
 #include "openbios/bindings.h"
 #include "openbios/drivers.h"
-#include "asm/types.h"
 #include "dict.h"
-#include "openbios/kernel.h"
-#include "openbios/stack.h"
 #include "openbios/nvram.h"
 #include "sys_info.h"
 #include "openbios.h"
@@ -23,9 +20,6 @@
 #include "openbios/firmware_abi.h"
 #include "boot.h"
 #include "../../drivers/timer.h" // XXX
-#include "asi.h"
-#include "spitfire.h"
-#include "libc/vsprintf.h"
 #define NO_QEMU_PROTOS
 #include "openbios/fw_cfg.h"
 #include "video_subr.h"
@@ -33,6 +27,8 @@
 #define BIOS_CFG_CMD  0x510
 #define BIOS_CFG_DATA 0x511
 
+#define UUID_FMT "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
+
 #define NVRAM_ADDR_LO 0x74
 #define NVRAM_ADDR_HI 0x75
 #define NVRAM_DATA    0x77
@@ -80,305 +76,7 @@
     const char *name;
 };
 
-#define PAGE_SIZE_4M   (4 * 1024 * 1024)
-#define PAGE_SIZE_512K (512 * 1024)
-#define PAGE_SIZE_64K  (64 * 1024)
-#define PAGE_SIZE_8K   (8 * 1024)
-#define PAGE_MASK_4M   (4 * 1024 * 1024 - 1)
-#define PAGE_MASK_512K (512 * 1024 - 1)
-#define PAGE_MASK_64K  (64 * 1024 - 1)
-#define PAGE_MASK_8K   (8 * 1024 - 1)
-
-#define UUID_FMT "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
-
-static void
-mmu_open(void)
-{
-    RET(-1);
-}
-
-static void
-mmu_close(void)
-{
-}
-
-static int
-spitfire_translate(unsigned long virt, unsigned long *p_phys,
-                   unsigned long *p_data, unsigned long *p_size)
-{
-    unsigned long phys, tag, data, mask, size;
-    unsigned int i;
-
-    for (i = 0; i < 64; i++) {
-        data = spitfire_get_dtlb_data(i);
-        if (data & 0x8000000000000000ULL) { // Valid entry?
-            switch ((data >> 61) & 3) {
-            default:
-            case 0x0: // 8k
-                mask = 0xffffffffffffe000ULL;
-                size = PAGE_SIZE_8K;
-                break;
-            case 0x1: // 64k
-                mask = 0xffffffffffff0000ULL;
-                size = PAGE_SIZE_64K;
-                break;
-            case 0x2: // 512k
-                mask = 0xfffffffffff80000ULL;
-                size = PAGE_SIZE_512K;
-                break;
-            case 0x3: // 4M
-                mask = 0xffffffffffc00000ULL;
-                size = PAGE_SIZE_4M;
-                break;
-            }
-            tag = spitfire_get_dtlb_tag(i);
-            if ((virt & mask) == (tag & mask)) {
-                phys = data & mask & 0x000001fffffff000ULL;
-                phys |= virt & ~mask;
-                *p_phys = phys;
-                *p_data = data & 0xfff;
-                *p_size = size;
-                return -1;
-            }
-        }
-    }
-
-    return 0;
-}
-
 /*
-  3.6.5 translate
-  ( virt -- false | phys.lo ... phys.hi mode true )
-*/
-static void
-mmu_translate(void)
-{
-    unsigned long virt, phys, data, size;
-
-    virt = POP();
-
-    if (spitfire_translate(virt, &phys, &data, &size)) {
-        PUSH(phys & 0xffffffff);
-        PUSH(phys >> 32);
-        PUSH(data);
-        PUSH(-1);
-        return;
-    }
-    PUSH(0);
-}
-
-static void
-dtlb_load2(unsigned long vaddr, unsigned long tte_data)
-{
-    asm("stxa %0, [%1] %2\n"
-        "stxa %3, [%%g0] %4\n"
-        : : "r" (vaddr), "r" (48), "i" (ASI_DMMU),
-          "r" (tte_data), "i" (ASI_DTLB_DATA_IN));
-}
-
-static void
-dtlb_load3(unsigned long vaddr, unsigned long tte_data,
-           unsigned long tte_index)
-{
-    asm("stxa %0, [%1] %2\n"
-        "stxa %3, [%4] %5\n"
-        : : "r" (vaddr), "r" (48), "i" (ASI_DMMU),
-          "r" (tte_data), "r" (tte_index << 3), "i" (ASI_DTLB_DATA_ACCESS));
-}
-
-/*
-  ( index tte_data vaddr -- ? )
-*/
-static void
-dtlb_load(void)
-{
-    unsigned long vaddr, tte_data, idx;
-
-    vaddr = POP();
-    tte_data = POP();
-    idx = POP();
-    dtlb_load3(vaddr, tte_data, idx);
-}
-
-static void
-itlb_load2(unsigned long vaddr, unsigned long tte_data)
-{
-    asm("stxa %0, [%1] %2\n"
-        "stxa %3, [%%g0] %4\n"
-        : : "r" (vaddr), "r" (48), "i" (ASI_IMMU),
-          "r" (tte_data), "i" (ASI_ITLB_DATA_IN));
-}
-
-static void
-itlb_load3(unsigned long vaddr, unsigned long tte_data,
-           unsigned long tte_index)
-{
-    asm("stxa %0, [%1] %2\n"
-        "stxa %3, [%4] %5\n"
-        : : "r" (vaddr), "r" (48), "i" (ASI_IMMU),
-          "r" (tte_data), "r" (tte_index << 3), "i" (ASI_ITLB_DATA_ACCESS));
-}
-
-/*
-  ( index tte_data vaddr -- ? )
-*/
-static void
-itlb_load(void)
-{
-    unsigned long vaddr, tte_data, idx;
-
-    vaddr = POP();
-    tte_data = POP();
-    idx = POP();
-    itlb_load3(vaddr, tte_data, idx);
-}
-
-static void
-map_pages(unsigned long virt, unsigned long size, unsigned long phys)
-{
-    unsigned long tte_data, currsize;
-
-    size = (size + PAGE_MASK_8K) & ~PAGE_MASK_8K;
-    while (size >= PAGE_SIZE_8K) {
-        currsize = size;
-        if (currsize >= PAGE_SIZE_4M &&
-            (virt & PAGE_MASK_4M) == 0 &&
-            (phys & PAGE_MASK_4M) == 0) {
-            currsize = PAGE_SIZE_4M;
-            tte_data = 6ULL << 60;
-        } else if (currsize >= PAGE_SIZE_512K &&
-                   (virt & PAGE_MASK_512K) == 0 &&
-                   (phys & PAGE_MASK_512K) == 0) {
-            currsize = PAGE_SIZE_512K;
-            tte_data = 4ULL << 60;
-        } else if (currsize >= PAGE_SIZE_64K &&
-                   (virt & PAGE_MASK_64K) == 0 &&
-                   (phys & PAGE_MASK_64K) == 0) {
-            currsize = PAGE_SIZE_64K;
-            tte_data = 2ULL << 60;
-        } else {
-            currsize = PAGE_SIZE_8K;
-            tte_data = 0;
-        }
-        tte_data |= phys | 0x8000000000000036ULL;
-        dtlb_load2(virt, tte_data);
-        itlb_load2(virt, tte_data);
-        size -= currsize;
-        phys += currsize;
-        virt += currsize;
-    }
-}
-
-/*
-  3.6.5 map
-  ( phys.lo ... phys.hi virt size mode -- )
-*/
-static void
-mmu_map(void)
-{
-    unsigned long virt, size, mode, phys;
-
-    mode = POP();
-    size = POP();
-    virt = POP();
-    phys = POP();
-    phys <<= 32;
-    phys |= POP();
-    map_pages(virt, size, phys);
-}
-
-static void
-itlb_demap(unsigned long vaddr)
-{
-    asm("stxa %0, [%0] %1\n"
-        : : "r" (vaddr), "i" (ASI_IMMU_DEMAP));
-}
-
-static void
-dtlb_demap(unsigned long vaddr)
-{
-    asm("stxa %0, [%0] %1\n"
-        : : "r" (vaddr), "i" (ASI_DMMU_DEMAP));
-}
-
-static void
-unmap_pages(unsigned long virt, unsigned long size)
-{
-    unsigned long phys, data;
-
-    unsigned long currsize;
-
-    // align size
-    size = (size + PAGE_MASK_8K) & ~PAGE_MASK_8K;
-
-    while (spitfire_translate(virt, &phys, &data, &currsize)) {
-
-        itlb_demap(virt & ~0x1fffULL);
-        dtlb_demap(virt & ~0x1fffULL);
-
-        size -= currsize;
-        virt += currsize;
-    }
-}
-
-/*
-  3.6.5 unmap
-  ( virt size -- )
-*/
-static void
-mmu_unmap(void)
-{
-    unsigned long virt, size;
-
-    size = POP();
-    virt = POP();
-    unmap_pages(virt, size);
-}
-
-/*
-  3.6.5 claim
-  ( virt size align -- base )
-*/
-static void
-mmu_claim(void)
-{
-    unsigned long virt, size, align;
-
-    align = POP();
-    size = POP();
-    virt = POP();
-    PUSH(virt); // XXX
-}
-
-/*
-  3.6.5 release
-  ( virt size -- )
-*/
-static void
-mmu_release(void)
-{
-    unsigned long virt, size;
-
-    size = POP();
-    virt = POP();
-    // XXX
-}
-
-DECLARE_UNNAMED_NODE(mmu, INSTALL_OPEN, 0);
-
-NODE_METHODS(mmu) = {
-    { "open",               mmu_open              },
-    { "close",              mmu_close             },
-    { "translate",          mmu_translate         },
-    { "SUNW,dtlb-load",     dtlb_load             },
-    { "SUNW,itlb-load",     itlb_load             },
-    { "map",                mmu_map               },
-    { "unmap",              mmu_unmap             },
-    { "claim",              mmu_claim             },
-    { "release",            mmu_release           },
-};
-
-/*
   ( addr -- ? )
 */
 static void
@@ -394,7 +92,6 @@
 static void cpu_generic_init(const struct cpudef *cpu, uint32_t clock_frequency)
 {
     unsigned long iu_version;
-    char nodebuff[256];
 
     push_str("/");
     fword("find-device");
@@ -442,31 +139,6 @@
 
     fword("finish-device");
 
-    // MMU node
-    snprintf(nodebuff, sizeof(nodebuff), "/%s", cpu->name);
-    push_str(nodebuff);
-    fword("find-device");
-
-    fword("new-device");
-
-    push_str("mmu");
-    fword("device-name");
-
-    fword("finish-device");
-
-    snprintf(nodebuff, sizeof(nodebuff), "/%s/mmu", cpu->name);
-
-    REGISTER_NODE_METHODS(mmu, nodebuff);
-
-    push_str("/chosen");
-    fword("find-device");
-
-    push_str(nodebuff);
-    fword("open-dev");
-    fword("encode-int");
-    push_str("mmu");
-    fword("property");
-
     // Trap table
     push_str("/openprom/client-services");
     fword("find-device");
@@ -723,128 +395,10 @@
     push_str("clock-frequency");
     fword("property");
 
-    push_str("/memory");
-    fword("find-device");
-
     ram_size = fw_cfg_read_i64(FW_CFG_RAM_SIZE);
 
-    // All memory: 0 to RAM_size
-    PUSH(0);
-    fword("encode-int");
-    PUSH(0);
-    fword("encode-int");
-    fword("encode+");
-    PUSH((int)(ram_size >> 32));
-    fword("encode-int");
-    fword("encode+");
-    PUSH((int)(ram_size & 0xffffffff));
-    fword("encode-int");
-    fword("encode+");
-    push_str("reg");
-    fword("property");
+    ob_mmu_init(cpu->name, ram_size);
 
-    // Available memory: 0 to va2pa(_start)
-    PUSH(0);
-    fword("encode-int");
-    PUSH(0);
-    fword("encode-int");
-    fword("encode+");
-    PUSH((va2pa((unsigned long)&_data) - 8192) >> 32);
-    fword("encode-int");
-    fword("encode+");
-    PUSH((va2pa((unsigned long)&_data) - 8192) & 0xffffffff);
-    fword("encode-int");
-    fword("encode+");
-    push_str("available");
-    fword("property");
-
-    // XXX
-    // Translations
-    push_str("/virtual-memory");
-    fword("find-device");
-
-    // 0 to 16M: 1:1
-    PUSH(0);
-    fword("encode-int");
-    PUSH(0);
-    fword("encode-int");
-    fword("encode+");
-    PUSH(0);
-    fword("encode-int");
-    fword("encode+");
-    PUSH(16 * 1024 * 1024);
-    fword("encode-int");
-    fword("encode+");
-    PUSH(0x80000000);
-    fword("encode-int");
-    fword("encode+");
-    PUSH(0x00000036);
-    fword("encode-int");
-    fword("encode+");
-
-    // _start to _data: ROM used
-    PUSH(0);
-    fword("encode-int");
-    fword("encode+");
-    PUSH((unsigned long)&_start);
-    fword("encode-int");
-    fword("encode+");
-    PUSH(0);
-    fword("encode-int");
-    fword("encode+");
-    PUSH((unsigned long)&_data - (unsigned long)&_start);
-    fword("encode-int");
-    fword("encode+");
-    PUSH(0x800001ff);
-    fword("encode-int");
-    fword("encode+");
-    PUSH(0xf0000074);
-    fword("encode-int");
-    fword("encode+");
-
-    // _data to _end: end of RAM
-    PUSH(0);
-    fword("encode-int");
-    fword("encode+");
-    PUSH((unsigned long)&_data);
-    fword("encode-int");
-    fword("encode+");
-    PUSH(0);
-    fword("encode-int");
-    fword("encode+");
-    PUSH((unsigned long)&_data - (unsigned long)&_start);
-    fword("encode-int");
-    fword("encode+");
-    PUSH(((va2pa((unsigned long)&_data) - 8192) >> 32) | 0x80000000);
-    fword("encode-int");
-    fword("encode+");
-    PUSH(((va2pa((unsigned long)&_data) - 8192) & 0xffffffff) | 0x36);
-    fword("encode-int");
-    fword("encode+");
-
-    // VGA buffer (128k): 1:1
-    PUSH(0x1ff);
-    fword("encode-int");
-    fword("encode+");
-    PUSH(0x004a0000);
-    fword("encode-int");
-    fword("encode+");
-    PUSH(0);
-    fword("encode-int");
-    fword("encode+");
-    PUSH(128 * 1024);
-    fword("encode-int");
-    fword("encode+");
-    PUSH(0x800001ff);
-    fword("encode-int");
-    fword("encode+");
-    PUSH(0x004a0076);
-    fword("encode-int");
-    fword("encode+");
-
-    push_str("translations");
-    fword("property");
-
     push_str("/chosen");
     fword("find-device");
 




More information about the OpenBIOS mailing list