On Thu, May 28, 2020 at 11:56 AM Mitchell Horne <mho...@freebsd.org> 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.h Thu May 28 13:48:33 2020 > (r361586) > +++ head/sys/riscv/include/vmparam.h Thu May 28 14:56:11 2020 > (r361587) > @@ -190,8 +190,6 @@ > #define SHAREDPAGE (VM_MAXUSER_ADDRESS - PAGE_SIZE) > #define USRSTACK SHAREDPAGE > > -#define KERNENTRY (0) > - > #define VM_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_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); > } _______________________________________________ svn-src-head@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"