commit-grub
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[2535] 2009-08-25 Vladimir Serbinenko <address@hidden>


From: Vladimir Serbinenko
Subject: [2535] 2009-08-25 Vladimir Serbinenko <address@hidden>
Date: Wed, 26 Aug 2009 00:32:58 +0000

Revision: 2535
          http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=2535
Author:   phcoder
Date:     2009-08-26 00:32:57 +0000 (Wed, 26 Aug 2009)
Log Message:
-----------
2009-08-25  Vladimir Serbinenko  <address@hidden>

        NetBSD memory map support.

        * include/grub/i386/bsd.h (NETBSD_BTINFO_MEMMAP): New definition.
        (grub_netbsd_btinfo_mmap_header): New structure.
        (grub_netbsd_btinfo_mmap_entry): Likewise.
        * loader/i386/bsd.c (grub_netbsd_boot): Pass memory map.

Modified Paths:
--------------
    trunk/grub2/ChangeLog
    trunk/grub2/include/grub/i386/bsd.h
    trunk/grub2/loader/i386/bsd.c

Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog       2009-08-25 23:18:48 UTC (rev 2534)
+++ trunk/grub2/ChangeLog       2009-08-26 00:32:57 UTC (rev 2535)
@@ -1,5 +1,14 @@
 2009-08-25  Vladimir Serbinenko  <address@hidden>
 
+       NetBSD memory map support.
+
+       * include/grub/i386/bsd.h (NETBSD_BTINFO_MEMMAP): New definition.
+       (grub_netbsd_btinfo_mmap_header): New structure.
+       (grub_netbsd_btinfo_mmap_entry): Likewise.
+       * loader/i386/bsd.c (grub_netbsd_boot): Pass memory map.
+
+2009-08-25  Vladimir Serbinenko  <address@hidden>
+
        Enable bsd.mod on coreboot.
 
        * conf/i386-coreboot.rmk (pkglib_MODULES): Add bsd.mod.

Modified: trunk/grub2/include/grub/i386/bsd.h
===================================================================
--- trunk/grub2/include/grub/i386/bsd.h 2009-08-25 23:18:48 UTC (rev 2534)
+++ trunk/grub2/include/grub/i386/bsd.h 2009-08-26 00:32:57 UTC (rev 2535)
@@ -203,6 +203,7 @@
 #define NETBSD_BTINFO_BOOTPATH         0
 #define NETBSD_BTINFO_ROOTDEVICE       1
 #define NETBSD_BTINFO_BOOTDISK         3
+#define NETBSD_BTINFO_MEMMAP           9
 
 struct grub_netbsd_btinfo_common
 {
@@ -210,6 +211,23 @@
   int type;
 };
 
+struct grub_netbsd_btinfo_mmap_header
+{
+  struct grub_netbsd_btinfo_common common;
+  grub_uint32_t count;
+};
+
+struct grub_netbsd_btinfo_mmap_entry
+{
+  grub_uint64_t addr;
+  grub_uint64_t len;
+#define        NETBSD_MMAP_AVAILABLE   1
+#define        NETBSD_MMAP_RESERVED    2
+#define        NETBSD_MMAP_ACPI        3
+#define        NETBSD_MMAP_NVS         4
+  grub_uint32_t type;
+};
+
 struct grub_netbsd_btinfo_bootpath
 {
   struct grub_netbsd_btinfo_common common;

Modified: trunk/grub2/loader/i386/bsd.c
===================================================================
--- trunk/grub2/loader/i386/bsd.c       2009-08-25 23:18:48 UTC (rev 2534)
+++ trunk/grub2/loader/i386/bsd.c       2009-08-26 00:32:57 UTC (rev 2535)
@@ -630,30 +630,87 @@
 grub_netbsd_boot (void)
 {
   struct grub_netbsd_bootinfo *bootinfo;
+  int count = 0;
+  struct grub_netbsd_btinfo_mmap_header *mmap;
+  struct grub_netbsd_btinfo_mmap_entry *pm;
+  void *curarg;
 
+  auto int NESTED_FUNC_ATTR count_hook (grub_uint64_t, grub_uint64_t, 
grub_uint32_t);
+  int NESTED_FUNC_ATTR count_hook (grub_uint64_t addr __attribute__ ((unused)),
+                                  grub_uint64_t size __attribute__ ((unused)),
+                                  grub_uint32_t type __attribute__ ((unused)))
+  {
+    count++;
+    return 0;
+  }
+
+  auto int NESTED_FUNC_ATTR fill_hook (grub_uint64_t, grub_uint64_t, 
grub_uint32_t);
+  int NESTED_FUNC_ATTR fill_hook (grub_uint64_t addr, grub_uint64_t size, 
grub_uint32_t type)
+  {
+    pm->addr = addr;
+    pm->len = size;
+
+    switch (type)
+      {
+      case GRUB_MACHINE_MEMORY_AVAILABLE:
+       pm->type = NETBSD_MMAP_AVAILABLE;
+       break;
+
+      case GRUB_MACHINE_MEMORY_ACPI:
+       pm->type = NETBSD_MMAP_ACPI;
+       break;
+
+      case GRUB_MACHINE_MEMORY_NVS:
+       pm->type = NETBSD_MMAP_NVS;
+       break;
+
+      default:
+       pm->type = NETBSD_MMAP_RESERVED;
+       break;
+      }
+    pm++;
+
+    return 0;
+  }
+
+  grub_mmap_iterate (count_hook);
+
   if (kern_end + sizeof (struct grub_netbsd_btinfo_rootdevice)
-      + sizeof (struct grub_netbsd_bootinfo) > grub_os_area_addr
-      + grub_os_area_size)
+      + sizeof (struct grub_netbsd_bootinfo)
+      + sizeof (struct grub_netbsd_btinfo_mmap_header)
+      + count * sizeof (struct grub_netbsd_btinfo_mmap_entry)
+      > grub_os_area_addr + grub_os_area_size)
     return grub_error (GRUB_ERR_OUT_OF_MEMORY, "No memory for boot info.");
 
+  curarg = mmap = (struct grub_netbsd_btinfo_mmap_header *) kern_end;
+  pm = (struct grub_netbsd_btinfo_mmap_entry *) (mmap + 1);
+
+  grub_mmap_iterate (fill_hook);
+  mmap->common.type = NETBSD_BTINFO_MEMMAP;
+  mmap->common.len = (char *) pm - (char *) mmap;
+  mmap->count = count;
+  curarg = pm;
+
   if (netbsd_root)
     {
       struct grub_netbsd_btinfo_rootdevice *rootdev;
 
-      rootdev = (struct grub_netbsd_btinfo_rootdevice *) kern_end;
+      rootdev = (struct grub_netbsd_btinfo_rootdevice *) curarg;
 
       rootdev->common.len = sizeof (struct grub_netbsd_btinfo_rootdevice);
       rootdev->common.type = NETBSD_BTINFO_ROOTDEVICE;
       grub_strncpy (rootdev->devname, netbsd_root, sizeof (rootdev->devname));
 
       bootinfo = (struct grub_netbsd_bootinfo *) (rootdev + 1);
-      bootinfo->bi_count = 1;
-      bootinfo->bi_data[0] = rootdev;
+      bootinfo->bi_count = 2;
+      bootinfo->bi_data[0] = mmap;
+      bootinfo->bi_data[1] = rootdev;
     }
   else
     {
-      bootinfo = (struct grub_netbsd_bootinfo *) kern_end;
-      bootinfo->bi_count = 0;
+      bootinfo = (struct grub_netbsd_bootinfo *) curarg;
+      bootinfo->bi_count = 1;
+      bootinfo->bi_data[0] = mmap;
     }
 
   grub_unix_real_boot (entry, bootflags, 0, bootinfo,





reply via email to

[Prev in Thread] Current Thread [Next in Thread]