Claudio Jeker <cje...@diehard.n-r-g.com> 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.

>
> 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
>

Reply via email to