Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/x86/x86 rearrange code to remove need for the scrat...



details:   https://anonhg.NetBSD.org/src/rev/5fa6b3eac15a
branches:  trunk
changeset: 935148:5fa6b3eac15a
user:      jdolecek <jdolecek%NetBSD.org@localhost>
date:      Thu Jun 25 17:24:31 2020 +0000

description:
rearrange code to remove need for the scratch space variable, simply put
the data to destination bootinfo buffer directly

XXX compile tested only, needs confirmation that it still works

diffstat:

 sys/arch/x86/x86/multiboot2.c |  80 ++++++++++++++++++++++++------------------
 1 files changed, 45 insertions(+), 35 deletions(-)

diffs (179 lines):

diff -r e7cc9290004b -r 5fa6b3eac15a sys/arch/x86/x86/multiboot2.c
--- a/sys/arch/x86/x86/multiboot2.c     Thu Jun 25 17:08:32 2020 +0000
+++ b/sys/arch/x86/x86/multiboot2.c     Thu Jun 25 17:24:31 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: multiboot2.c,v 1.5 2020/06/24 22:28:07 jdolecek Exp $  */
+/*     $NetBSD: multiboot2.c,v 1.6 2020/06/25 17:24:31 jdolecek Exp $  */
 
 /*-
  * Copyright (c) 2005, 2006 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: multiboot2.c,v 1.5 2020/06/24 22:28:07 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: multiboot2.c,v 1.6 2020/06/25 17:24:31 jdolecek Exp $");
 
 #include "opt_multiboot.h"
 
@@ -115,7 +115,6 @@
 bool multiboot2_enabled = false;
 bool has_syms = false;
 struct multiboot_symbols Multiboot_Symbols;
-static char bimbuf[16384];
 
 #define RELOC(type, x) ((type)((vaddr_t)(x) - KERNBASE))
 
@@ -346,16 +345,13 @@
        return;
 }
 
-static void
-bootinfo_add(struct btinfo_common *item, int type, int len)    
+static struct btinfo_common *
+bootinfo_init(int type, int len)
 {
        int i;  
        struct bootinfo *bip = (struct bootinfo *)&bootinfo;
        vaddr_t data;
 
-       item->type = type;
-       item->len = len;
-
        data = (vaddr_t)&bip->bi_data;
        for (i = 0; i < bip->bi_nentries; i++) {
                struct btinfo_common *tmp;
@@ -364,12 +360,29 @@
                data += tmp->len;
        }
        if (data + len < (vaddr_t)&bip->bi_data + sizeof(bip->bi_data)) {
-               memcpy((void *)data, item, len);
+               /* Initialize the common part */
+               struct btinfo_common *item = (struct btinfo_common *)data;
+               item->type = type;
+               item->len = len;
                bip->bi_nentries++;
+               return item;
+       } else {
+               return NULL;
        }
 }
 
 static void
+bootinfo_add(struct btinfo_common *item, int type, int len)
+{
+       struct btinfo_common *bip = bootinfo_init(type, len);
+       if (bip == NULL)
+               return;
+
+       /* Copy the data after the common part over */
+       memcpy(&bip[1], &item[1], len - sizeof(*item));
+}
+
+static void
 mbi_cmdline(struct multiboot_tag_string *mbt)
 {
        char *cmdline = mbt->string;
@@ -450,11 +463,11 @@
        struct btinfo_modulelist *bim;
 
        bim_len = sizeof(*bim) + (module_count * sizeof(*bie));
-       if (bim_len > sizeof(bimbuf))
+       bim = (struct btinfo_modulelist *)bootinfo_init(BTINFO_MODULELIST,
+           bim_len);
+       if (bim == NULL)
                return;
 
-       bim = (struct btinfo_modulelist *)bimbuf;
-
        bim->num = module_count;
        bim->endpa = end;
 
@@ -474,11 +487,6 @@
 
                bie++;
        }
-
-       bootinfo_add((struct btinfo_common *)&bim,
-           BTINFO_MODULELIST, bim_len);
-
-       return;
 }
 
 static void
@@ -518,12 +526,24 @@
 mbi_mmap(struct multiboot_tag_mmap *mbt)
 {
        struct btinfo_memmap *bim;
+       int num;
        char *cp;
 
        if (mbt->entry_version != 0)
                return;
 
-       bim = (struct btinfo_memmap *)bimbuf;
+       /* Determine size */
+       num = 0;
+       for (cp = (char *)(mbt + 1);
+            cp - (char *)mbt < mbt->size;
+            cp += mbt->entry_size) {
+               num++;
+       }
+
+       bim = (struct btinfo_memmap *)bootinfo_init(BTINFO_MEMMAP,
+           sizeof(num) + num * sizeof(struct bi_memmap_entry));
+       if (bim == NULL)
+               return;
        bim->num = 0;
 
        for (cp = (char *)(mbt + 1);
@@ -557,15 +577,9 @@
                }
 
                bim->num++;
-
-               if ((char*)&bim->entry[bim->num] - (char *)bim > sizeof(bimbuf))
-                       break;
        }
 
-       bootinfo_add((struct btinfo_common *)bim, BTINFO_MEMMAP,
-           (char*)&bim->entry[bim->num] - (char *)bim);
-
-       return;
+       KASSERT(bim->num == num);
 }
 
 static void
@@ -614,26 +628,22 @@
 static void
 mbi_efi_mmap(struct multiboot_tag_efi_mmap *mbt)
 {
-       struct btinfo_efimemmap *bie = (struct btinfo_efimemmap *)bimbuf;
+       struct btinfo_efimemmap *bie;
        size_t bie_len;
 
        if (mbt->descr_vers != 0)
-               goto out;
+               return;
 
        bie_len = sizeof(*bie) + mbt->size - sizeof(*mbt);
-       if (bie_len > sizeof(bimbuf))
-               goto out;
+       bie = (struct btinfo_efimemmap *)bootinfo_init(BTINFO_EFIMEMMAP,
+           bie_len);
+       if (bie == NULL)
+               return;
 
        bie->num = (mbt->size - sizeof(*mbt)) / mbt->descr_size;
        bie->version = mbt->descr_vers;
        bie->size = mbt->descr_size;
        memcpy(bie->memmap, mbt + 1, mbt->size - sizeof(*mbt));
-
-       bootinfo_add((struct btinfo_common *)bie,
-           BTINFO_EFIMEMMAP, bie_len);
-
-out:
-       return;
 }
 
 void



Home | Main Index | Thread Index | Old Index