Re: svn commit: r361587 - in head/sys/riscv: include riscv
On Thu, May 28, 2020 at 11:56 AM Mitchell Horne wrote: > > Author: mhorne > Date: Thu May 28 14:56:11 2020 > New Revision: 361587 > URL: https://svnweb.freebsd.org/changeset/base/361587 > > Log: > Add macros simplifying the fake preload setup > > This is in preparation for booting via loader(8). Lift these macros from > arm64 > so we don't need to worry about the size when inserting new elements. This > could have been done in r359673, but I didn't think I would be returning to > this function so soon. > > Reviewed by: markj > Differential Revision:https://reviews.freebsd.org/D24910 > > Modified: > head/sys/riscv/include/vmparam.h > head/sys/riscv/riscv/machdep.c > > Modified: head/sys/riscv/include/vmparam.h > == > --- head/sys/riscv/include/vmparam.hThu May 28 13:48:33 2020 > (r361586) > +++ head/sys/riscv/include/vmparam.hThu May 28 14:56:11 2020 > (r361587) > @@ -190,8 +190,6 @@ > #defineSHAREDPAGE (VM_MAXUSER_ADDRESS - PAGE_SIZE) > #defineUSRSTACKSHAREDPAGE > > -#defineKERNENTRY (0) > - > #defineVM_EARLY_DTB_ADDRESS(VM_MAX_KERNEL_ADDRESS - (2 * > L2_SIZE)) > > /* > > Modified: head/sys/riscv/riscv/machdep.c > == > --- head/sys/riscv/riscv/machdep.c Thu May 28 13:48:33 2020 > (r361586) > +++ head/sys/riscv/riscv/machdep.c Thu May 28 14:56:11 2020 > (r361587) > @@ -733,29 +733,36 @@ fake_preload_metadata(struct riscv_bootparams *rvbp) > vm_offset_t zstart = 0, zend = 0; > #endif > vm_offset_t lastaddr; > - size_t dtb_size; > - int i; > + size_t fake_size, dtb_size; > > - i = 0; > +#define PRELOAD_PUSH_VALUE(type, value) do { \ > + *(type *)((char *)fake_preload + fake_size) = (value); \ > + fake_size += sizeof(type); \ > +} while (0) > > - fake_preload[i++] = MODINFO_NAME; > - fake_preload[i++] = strlen("kernel") + 1; > - strcpy((char*)&fake_preload[i++], "kernel"); > - i += 1; > - fake_preload[i++] = MODINFO_TYPE; > - fake_preload[i++] = strlen("elf64 kernel") + 1; > - strcpy((char*)&fake_preload[i++], "elf64 kernel"); > - i += 3; > - fake_preload[i++] = MODINFO_ADDR; > - fake_preload[i++] = sizeof(vm_offset_t); > - *(vm_offset_t *)&fake_preload[i++] = > - (vm_offset_t)(KERNBASE + KERNENTRY); > - i += 1; > - fake_preload[i++] = MODINFO_SIZE; > - fake_preload[i++] = sizeof(vm_offset_t); > - fake_preload[i++] = (vm_offset_t)&end - > - (vm_offset_t)(KERNBASE + KERNENTRY); > - i += 1; > +#define PRELOAD_PUSH_STRING(str) do { \ > + uint32_t ssize; \ > + ssize = strlen(str) + 1;\ > + PRELOAD_PUSH_VALUE(uint32_t, ssize);\ > + strcpy(((char *)fake_preload + fake_size), str);\ > + fake_size += ssize; \ > + fake_size = roundup(fake_size, sizeof(u_long)); \ > +} while (0) > + > + fake_size = 0; > + > + PRELOAD_PUSH_VALUE(uint32_t, MODINFO_NAME); > + PRELOAD_PUSH_STRING("kernel"); > + PRELOAD_PUSH_VALUE(uint32_t, MODINFO_TYPE); > + PRELOAD_PUSH_STRING("elf kernel"); Note that the type here was unintentionally changed from "elf64 kernel" to "elf kernel". Fortunately, this ends up being more consistent with both loader(8) and the other fake_preload_metadata routines, which set the type as "elf kernel". Thanks to rpokala@ for pointing this out. > + > + PRELOAD_PUSH_VALUE(uint32_t, MODINFO_ADDR); > + PRELOAD_PUSH_VALUE(uint32_t, sizeof(vm_offset_t)); > + PRELOAD_PUSH_VALUE(uint64_t, KERNBASE); > + > + PRELOAD_PUSH_VALUE(uint32_t, MODINFO_SIZE); > + PRELOAD_PUSH_VALUE(uint32_t, sizeof(size_t)); > + PRELOAD_PUSH_VALUE(uint64_t, (size_t)((vm_offset_t)&end - KERNBASE)); > #ifdef DDB > #if 0 > /* RISCVTODO */ > @@ -777,19 +784,20 @@ fake_preload_metadata(struct riscv_bootparams *rvbp) > > /* Copy the DTB to KVA space. */ > lastaddr = roundup(lastaddr, sizeof(int)); > - fake_preload[i++] = MODINFO_METADATA | MODINFOMD_DTBP; > - fake_preload[i++] = sizeof(vm_offset_t); > - *(vm_offset_t *)&fake_preload[i] = (vm_offset_t)lastaddr; > - i += sizeof(vm_offset_t) / sizeof(uint32_t); > + PRELOAD_PUSH_VALUE(uint32_t, MODINFO_METADATA | MODINFOMD_DTBP); > + PRELOAD_PUSH_VALUE(uint32_t, sizeof(vm_offset_t)); > + PRELOAD_PUSH_VALUE(vm_offset_t, lastaddr); > dtb_size = fdt_totalsize(rvbp->dtbp_virt); > memmove((void *)lastaddr, (const void *)rvbp->dtbp_virt, dtb_
svn commit: r361587 - in head/sys/riscv: include riscv
Author: mhorne Date: Thu May 28 14:56:11 2020 New Revision: 361587 URL: https://svnweb.freebsd.org/changeset/base/361587 Log: Add macros simplifying the fake preload setup This is in preparation for booting via loader(8). Lift these macros from arm64 so we don't need to worry about the size when inserting new elements. This could have been done in r359673, but I didn't think I would be returning to this function so soon. Reviewed by: markj Differential Revision:https://reviews.freebsd.org/D24910 Modified: head/sys/riscv/include/vmparam.h head/sys/riscv/riscv/machdep.c Modified: head/sys/riscv/include/vmparam.h == --- head/sys/riscv/include/vmparam.hThu May 28 13:48:33 2020 (r361586) +++ head/sys/riscv/include/vmparam.hThu May 28 14:56:11 2020 (r361587) @@ -190,8 +190,6 @@ #defineSHAREDPAGE (VM_MAXUSER_ADDRESS - PAGE_SIZE) #defineUSRSTACKSHAREDPAGE -#defineKERNENTRY (0) - #defineVM_EARLY_DTB_ADDRESS(VM_MAX_KERNEL_ADDRESS - (2 * L2_SIZE)) /* Modified: head/sys/riscv/riscv/machdep.c == --- head/sys/riscv/riscv/machdep.c Thu May 28 13:48:33 2020 (r361586) +++ head/sys/riscv/riscv/machdep.c Thu May 28 14:56:11 2020 (r361587) @@ -733,29 +733,36 @@ fake_preload_metadata(struct riscv_bootparams *rvbp) vm_offset_t zstart = 0, zend = 0; #endif vm_offset_t lastaddr; - size_t dtb_size; - int i; + size_t fake_size, dtb_size; - i = 0; +#define PRELOAD_PUSH_VALUE(type, value) do { \ + *(type *)((char *)fake_preload + fake_size) = (value); \ + fake_size += sizeof(type); \ +} while (0) - fake_preload[i++] = MODINFO_NAME; - fake_preload[i++] = strlen("kernel") + 1; - strcpy((char*)&fake_preload[i++], "kernel"); - i += 1; - fake_preload[i++] = MODINFO_TYPE; - fake_preload[i++] = strlen("elf64 kernel") + 1; - strcpy((char*)&fake_preload[i++], "elf64 kernel"); - i += 3; - fake_preload[i++] = MODINFO_ADDR; - fake_preload[i++] = sizeof(vm_offset_t); - *(vm_offset_t *)&fake_preload[i++] = - (vm_offset_t)(KERNBASE + KERNENTRY); - i += 1; - fake_preload[i++] = MODINFO_SIZE; - fake_preload[i++] = sizeof(vm_offset_t); - fake_preload[i++] = (vm_offset_t)&end - - (vm_offset_t)(KERNBASE + KERNENTRY); - i += 1; +#define PRELOAD_PUSH_STRING(str) do { \ + uint32_t ssize; \ + ssize = strlen(str) + 1;\ + PRELOAD_PUSH_VALUE(uint32_t, ssize);\ + strcpy(((char *)fake_preload + fake_size), str);\ + fake_size += ssize; \ + fake_size = roundup(fake_size, sizeof(u_long)); \ +} while (0) + + fake_size = 0; + + PRELOAD_PUSH_VALUE(uint32_t, MODINFO_NAME); + PRELOAD_PUSH_STRING("kernel"); + PRELOAD_PUSH_VALUE(uint32_t, MODINFO_TYPE); + PRELOAD_PUSH_STRING("elf kernel"); + + PRELOAD_PUSH_VALUE(uint32_t, MODINFO_ADDR); + PRELOAD_PUSH_VALUE(uint32_t, sizeof(vm_offset_t)); + PRELOAD_PUSH_VALUE(uint64_t, KERNBASE); + + PRELOAD_PUSH_VALUE(uint32_t, MODINFO_SIZE); + PRELOAD_PUSH_VALUE(uint32_t, sizeof(size_t)); + PRELOAD_PUSH_VALUE(uint64_t, (size_t)((vm_offset_t)&end - KERNBASE)); #ifdef DDB #if 0 /* RISCVTODO */ @@ -777,19 +784,20 @@ fake_preload_metadata(struct riscv_bootparams *rvbp) /* Copy the DTB to KVA space. */ lastaddr = roundup(lastaddr, sizeof(int)); - fake_preload[i++] = MODINFO_METADATA | MODINFOMD_DTBP; - fake_preload[i++] = sizeof(vm_offset_t); - *(vm_offset_t *)&fake_preload[i] = (vm_offset_t)lastaddr; - i += sizeof(vm_offset_t) / sizeof(uint32_t); + PRELOAD_PUSH_VALUE(uint32_t, MODINFO_METADATA | MODINFOMD_DTBP); + PRELOAD_PUSH_VALUE(uint32_t, sizeof(vm_offset_t)); + PRELOAD_PUSH_VALUE(vm_offset_t, lastaddr); dtb_size = fdt_totalsize(rvbp->dtbp_virt); memmove((void *)lastaddr, (const void *)rvbp->dtbp_virt, dtb_size); lastaddr = roundup(lastaddr + dtb_size, sizeof(int)); - fake_preload[i++] = 0; - fake_preload[i] = 0; - preload_metadata = (void *)fake_preload; + /* End marker */ + PRELOAD_PUSH_VALUE(uint32_t, 0); + PRELOAD_PUSH_VALUE(uint32_t, 0); + preload_metadata = (caddr_t)fake_preload; - KASSERT(i < nitems(fake_preload), ("Too many fake_preload items")); + KASSERT(fake_size < sizeof(fake_preload), + ("Too many fake_preload items")); return (lastaddr); } ___