On Wed, Dec 22, 2021 at 10:14:40AM -0500, Dave Voutila wrote:
>
> Claudio Jeker <[email protected]> writes:
>
> > I added support for vmctl -cL -B net -b bsd.rd -d disk.img to run the
> > autoinstall by emulating a PXE boot. In the commit
> > https://github.com/openbsd/src/commit/a13de4d12a4c9ba0edc05aab2ad635f782449229
> > the feature got removed over eagerly.
> >
> > This diff adds this back because I find this super practical.
>
> Seems to add back more than that...see below.
>
Those are becasue of warnings from the compiler and I do not like to send
out diffs for files that compile with a bunch of warnings.
I can split this out into an extra commit if people prefer that.
> >
> > Index: loadfile.h
> > ===================================================================
> > RCS file: /cvs/src/usr.sbin/vmd/loadfile.h,v
> > retrieving revision 1.15
> > diff -u -p -r1.15 loadfile.h
> > --- loadfile.h 16 Jun 2021 16:55:02 -0000 1.15
> > +++ loadfile.h 22 Dec 2021 14:34:06 -0000
> > @@ -80,7 +80,8 @@
> > #define PML2_PAGE 0x13000
> > #define NPTE_PG (PAGE_SIZE / sizeof(uint64_t))
> >
> > -int loadfile_elf(gzFile, struct vm_create_params *, struct vcpu_reg_state
> > *);
> > +int loadfile_elf(gzFile, struct vm_create_params *, struct
> > vcpu_reg_state *,
> > + unsigned int);
> >
> > size_t mread(gzFile, paddr_t, size_t);
> >
> > Index: loadfile_elf.c
> > ===================================================================
> > RCS file: /cvs/src/usr.sbin/vmd/loadfile_elf.c,v
> > retrieving revision 1.39
> > diff -u -p -r1.39 loadfile_elf.c
> > --- loadfile_elf.c 4 May 2021 10:48:51 -0000 1.39
> > +++ loadfile_elf.c 22 Dec 2021 14:38:55 -0000
> > @@ -118,7 +118,7 @@ static void setsegment(struct mem_segmen
> > static int elf32_exec(gzFile, Elf32_Ehdr *, u_long *, int);
> > static int elf64_exec(gzFile, Elf64_Ehdr *, u_long *, int);
> > static size_t create_bios_memmap(struct vm_create_params *, bios_memmap_t
> > *);
> > -static uint32_t push_bootargs(bios_memmap_t *, size_t);
> > +static uint32_t push_bootargs(bios_memmap_t *, size_t, bios_bootmac_t *);
> > static size_t push_stack(uint32_t, uint32_t);
> > static void push_gdt(void);
> > static void push_pt_32(void);
> > @@ -264,13 +264,14 @@ push_pt_64(void)
> > */
> > int
> > loadfile_elf(gzFile fp, struct vm_create_params *vcp,
> > - struct vcpu_reg_state *vrs)
> > + struct vcpu_reg_state *vrs, unsigned int bootdevice)
> > {
> > int r, is_i386 = 0;
> > uint32_t bootargsz;
> > size_t n, stacksize;
> > u_long marks[MARK_MAX];
> > bios_memmap_t memmap[VMM_MAX_MEM_RANGES + 1];
> > + bios_bootmac_t bm, *bootmac = NULL;
> >
> > if ((r = gzread(fp, &hdr, sizeof(hdr))) != sizeof(hdr))
> > return 1;
> > @@ -301,8 +302,12 @@ loadfile_elf(gzFile fp, struct vm_create
> > else
> > push_pt_64();
> >
> > + if (bootdevice & VMBOOTDEV_NET) {
> > + bootmac = &bm;
> > + memcpy(bootmac, vcp->vcp_macs[0], ETHER_ADDR_LEN);
> > + }
> > n = create_bios_memmap(vcp, memmap);
> > - bootargsz = push_bootargs(memmap, n);
> > + bootargsz = push_bootargs(memmap, n, bootmac);
> > stacksize = push_stack(bootargsz, marks[MARK_END]);
> >
> > vrs->vrs_gprs[VCPU_REGS_RIP] = (uint64_t)marks[MARK_ENTRY];
> > @@ -382,9 +387,9 @@ create_bios_memmap(struct vm_create_para
> > * The size of the bootargs
> > */
> > static uint32_t
> > -push_bootargs(bios_memmap_t *memmap, size_t n)
> > +push_bootargs(bios_memmap_t *memmap, size_t n, bios_bootmac_t *bootmac)
> > {
> > - uint32_t memmap_sz, consdev_sz, i;
> > + uint32_t memmap_sz, consdev_sz, bootmac_sz, i;
> > bios_consdev_t consdev;
> > uint32_t ba[1024];
> >
> > @@ -408,6 +413,15 @@ push_bootargs(bios_memmap_t *memmap, siz
> > memcpy(&ba[i + 3], &consdev, sizeof(bios_consdev_t));
> > i += consdev_sz / sizeof(int);
> >
> > + if (bootmac) {
> > + bootmac_sz = 3 * sizeof(int) + (sizeof(bios_bootmac_t) + 3) &
> > ~3;
> > + ba[i] = 0x7; /* bootmac */
> > + ba[i + 1] = bootmac_sz;
> > + ba[i + 2] = bootmac_sz;
> > + memcpy(&ba[i + 3], bootmac, sizeof(bios_bootmac_t));
> > + i += bootmac_sz / sizeof(int);
> > + }
> > +
> > ba[i++] = 0xFFFFFFFF; /* BOOTARG_END */
> >
> > write_mem(BOOTARGS_PAGE, ba, PAGE_SIZE);
> > @@ -485,7 +499,7 @@ mread(gzFile fp, paddr_t addr, size_t sz
> > const char *errstr = NULL;
> > int errnum = 0;
> > size_t ct;
> > - size_t i, rd, osz;
> > + size_t i, osz;
>
> Not sure the removal of rd is related.
>
> > char buf[PAGE_SIZE];
> >
> > /*
> > @@ -493,7 +507,6 @@ mread(gzFile fp, paddr_t addr, size_t sz
> > * write_mem
> > */
> > ct = 0;
> > - rd = 0;
> > osz = sz;
> > if ((addr & PAGE_MASK) != 0) {
> > memset(buf, 0, sizeof(buf));
> > @@ -510,7 +523,6 @@ mread(gzFile fp, paddr_t addr, size_t sz
> > errnum, errstr);
> > return (0);
> > }
> > - rd += ct;
> >
>
> Same here
>
> > if (write_mem(addr, buf, ct))
> > return (0);
> > @@ -538,7 +550,6 @@ mread(gzFile fp, paddr_t addr, size_t sz
> > errnum, errstr);
> > return (0);
> > }
> > - rd += ct;
> >
>
> And here
>
> > if (write_mem(addr, buf, ct))
> > return (0);
> > @@ -664,7 +675,6 @@ elf64_exec(gzFile fp, Elf64_Ehdr *elf, u
> > Elf64_Off off;
> > int i;
> > size_t sz;
> > - int first;
> > int havesyms;
> > paddr_t minp = ~0, maxp = 0, pos = 0;
> > paddr_t offset = marks[MARK_START], shpp, elfp;
> > @@ -682,7 +692,7 @@ elf64_exec(gzFile fp, Elf64_Ehdr *elf, u
> > return 1;
> > }
> >
> > - for (first = 1, i = 0; i < elf->e_phnum; i++) {
> > + for (i = 0; i < elf->e_phnum; i++) {
>
> Is this related?
>
> > if (phdr[i].p_type == PT_OPENBSD_RANDOMIZE) {
> > int m;
> >
> > @@ -727,8 +737,6 @@ elf64_exec(gzFile fp, Elf64_Ehdr *elf, u
> > free(phdr);
> > return 1;
> > }
> > -
> > - first = 0;
> > }
> >
> > if ((IS_TEXT(phdr[i]) && (flags & (LOAD_TEXT | COUNT_TEXT))) ||
> > @@ -802,7 +810,7 @@ elf64_exec(gzFile fp, Elf64_Ehdr *elf, u
> > if (shp[i].sh_type == SHT_SYMTAB)
> > havesyms = 1;
> >
> > - for (first = 1, i = 0; i < elf->e_shnum; i++) {
> > + for (i = 0; i < elf->e_shnum; i++) {
> > if (shp[i].sh_type == SHT_SYMTAB ||
> > shp[i].sh_type == SHT_STRTAB ||
> > !strcmp(shstr + shp[i].sh_name, ".debug_line") ||
> > @@ -827,7 +835,6 @@ elf64_exec(gzFile fp, Elf64_Ehdr *elf, u
> > shp[i].sh_flags |= SHF_ALLOC;
> > off += roundup(shp[i].sh_size,
> > sizeof(Elf64_Addr));
> > - first = 0;
> > }
> > }
> > if (flags & LOAD_SYM) {
> > @@ -886,7 +893,6 @@ elf32_exec(gzFile fp, Elf32_Ehdr *elf, u
> > Elf32_Off off;
> > int i;
> > size_t sz;
> > - int first;
> > int havesyms;
> > paddr_t minp = ~0, maxp = 0, pos = 0;
> > paddr_t offset = marks[MARK_START], shpp, elfp;
> > @@ -904,7 +910,7 @@ elf32_exec(gzFile fp, Elf32_Ehdr *elf, u
> > return 1;
> > }
> >
> > - for (first = 1, i = 0; i < elf->e_phnum; i++) {
> > + for (i = 0; i < elf->e_phnum; i++) {
> > if (phdr[i].p_type == PT_OPENBSD_RANDOMIZE) {
> > int m;
> >
> > @@ -949,8 +955,6 @@ elf32_exec(gzFile fp, Elf32_Ehdr *elf, u
> > free(phdr);
> > return 1;
> > }
> > -
> > - first = 0;
> > }
> >
> > if ((IS_TEXT(phdr[i]) && (flags & (LOAD_TEXT | COUNT_TEXT))) ||
> > @@ -1024,7 +1028,7 @@ elf32_exec(gzFile fp, Elf32_Ehdr *elf, u
> > if (shp[i].sh_type == SHT_SYMTAB)
> > havesyms = 1;
> >
> > - for (first = 1, i = 0; i < elf->e_shnum; i++) {
> > + for (i = 0; i < elf->e_shnum; i++) {
> > if (shp[i].sh_type == SHT_SYMTAB ||
> > shp[i].sh_type == SHT_STRTAB ||
> > !strcmp(shstr + shp[i].sh_name, ".debug_line")) {
> > @@ -1048,7 +1052,6 @@ elf32_exec(gzFile fp, Elf32_Ehdr *elf, u
> > shp[i].sh_flags |= SHF_ALLOC;
> > off += roundup(shp[i].sh_size,
> > sizeof(Elf32_Addr));
> > - first = 0;
> > }
> > }
> > if (flags & LOAD_SYM) {
> > Index: vm.c
> > ===================================================================
> > RCS file: /cvs/src/usr.sbin/vmd/vm.c,v
> > retrieving revision 1.66
> > diff -u -p -r1.66 vm.c
> > --- vm.c 29 Nov 2021 05:17:35 -0000 1.66
> > +++ vm.c 22 Dec 2021 14:33:55 -0000
> > @@ -336,7 +336,7 @@ start_vm(struct vmd_vm *vm, int fd)
> > fatalx("failed to open kernel - exiting");
> >
> > /* Load kernel image */
> > - ret = loadfile_elf(fp, vcp, &vrs);
> > + ret = loadfile_elf(fp, vcp, &vrs, vmc->vmc_bootdevice);
> >
> > /*
> > * Try BIOS as a fallback (only if it was provided as an image
> >
--
:wq Claudio