[prev in list] [next in list] [prev in thread] [next in thread]
List: openbsd-tech
Subject: Re: arm64: recognize netboot
From: Mark Kettenis <mark.kettenis () xs4all ! nl>
Date: 2018-01-30 21:13:51
Message-ID: 500aca35dfe02075 () bloch ! sibelius ! xs4all ! nl
[Download RAW message or body]
> Date: Mon, 29 Jan 2018 20:23:09 +0100
> From: Christian Weisgerber <naddy@mips.inka.de>
>
> This allows an arm64 kernel to recognize that it has been netbooted
> and to add the boot interface to the "netboot" group. efiboot grabs
> the MAC address from the PXE environment, passes it to the kernel,
> where it is matched against the list of ethernet interfaces and the
> boot device is set. Concept and most of the code cribbed from amd64.
>
> Welcome to the OpenBSD/arm64 6.2 installation program.
> Starting non-interactive mode in 5 seconds...
> (I)nstall, (U)pgrade, (A)utoinstall or (S)hell?
>
> There are probably too many printfs in diskconf()...
>
> bootfile: tftp0a:/bsd
> PXE boot MAC address e0:ff:f7:00:20:3c, interface msk0
> boot device: msk0
>
> ... but I don't know what we want there. I'm also uncertain about
> the NFSCLIENT ifdef, but the x86 code evolved into this over a series
> of commits.
>
> I've omitted the efiboot version bump since that would conflict
> with my other efiboot diff.
The proper Open Firmware way of doing this is to privide a "bootpath"
variable under /chosen, but that won't work for the FDT since the PCI
network interface isn't present in the tree. So this approach is
prefectly fine with me.
ok kettenis@
> Index: arch/arm64/arm64/autoconf.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/arm64/arm64/autoconf.c,v
> retrieving revision 1.8
> diff -u -p -r1.8 autoconf.c
> --- arch/arm64/arm64/autoconf.c 27 Jan 2018 22:55:23 -0000 1.8
> +++ arch/arm64/arm64/autoconf.c 29 Jan 2018 17:53:28 -0000
> @@ -20,9 +20,15 @@
> #include <sys/conf.h>
> #include <sys/device.h>
> #include <sys/reboot.h>
> +#include <sys/socket.h>
> #include <sys/hibernate.h>
> #include <uvm/uvm.h>
>
> +#include <net/if.h>
> +#include <net/if_types.h>
> +#include <netinet/in.h>
> +#include <netinet/if_ether.h>
> +
> #include <machine/bootconfig.h>
>
> extern void dumpconf(void);
> @@ -63,6 +69,7 @@ diskconf(void)
> size_t len;
> char *p;
> dev_t tmpdev;
> + extern uint8_t *bootmac;
>
> if (*boot_file != '\0')
> printf("bootfile: %s\n", boot_file);
> @@ -75,6 +82,27 @@ diskconf(void)
> else
> len = strlen(boot_file);
> bootdv = parsedisk(boot_file, len, 0, &tmpdev);
> + }
> +
> + if (bootmac) {
> + struct ifnet *ifp;
> +
> + TAILQ_FOREACH(ifp, &ifnet, if_list) {
> + if (ifp->if_type == IFT_ETHER &&
> + memcmp(bootmac, ((struct arpcom *)ifp)->ac_enaddr,
> + ETHER_ADDR_LEN) == 0)
> + break;
> + }
> + if (ifp) {
> +#if defined(NFSCLIENT)
> + printf("PXE boot MAC address %s, interface %s\n",
> + ether_sprintf(bootmac), ifp->if_xname);
> + bootdv = parsedisk(ifp->if_xname, strlen(ifp->if_xname),
> + 0, &tmpdev);
> +#endif
> + } else
> + printf("PXE boot MAC address %s, interface %s\n",
> + ether_sprintf(bootmac), "unknown");
> }
>
> if (bootdv != NULL)
> Index: arch/arm64/arm64/machdep.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/arm64/arm64/machdep.c,v
> retrieving revision 1.27
> diff -u -p -r1.27 machdep.c
> --- arch/arm64/arm64/machdep.c 28 Jan 2018 13:17:45 -0000 1.27
> +++ arch/arm64/arm64/machdep.c 29 Jan 2018 16:38:32 -0000
> @@ -52,6 +52,8 @@
> char *boot_args = NULL;
> char *boot_file = "";
>
> +uint8_t *bootmac = NULL;
> +
> extern uint64_t esym;
>
> int stdout_node = 0;
> @@ -778,16 +780,23 @@ initarm(struct arm64_bootparams *abp)
>
> node = fdt_find_node("/chosen");
> if (node != NULL) {
> - char *args, *duid, *prop;
> + char *prop;
> int len;
> + static uint8_t lladdr[6];
>
> - len = fdt_node_property(node, "bootargs", &args);
> + len = fdt_node_property(node, "bootargs", &prop);
> if (len > 0)
> - collect_kernel_args(args);
> + collect_kernel_args(prop);
>
> - len = fdt_node_property(node, "openbsd,bootduid", &duid);
> + len = fdt_node_property(node, "openbsd,bootduid", &prop);
> if (len == sizeof(bootduid))
> - memcpy(bootduid, duid, sizeof(bootduid));
> + memcpy(bootduid, prop, sizeof(bootduid));
> +
> + len = fdt_node_property(node, "openbsd,bootmac", &prop);
> + if (len == sizeof(lladdr)) {
> + memcpy(lladdr, prop, sizeof(lladdr));
> + bootmac = lladdr;
> + }
>
> len = fdt_node_property(node, "openbsd,uefi-mmap-start", &prop);
> if (len == sizeof(mmap_start))
> Index: arch/arm64/stand/efiboot/efiboot.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/arm64/stand/efiboot/efiboot.c,v
> retrieving revision 1.14
> diff -u -p -r1.14 efiboot.c
> --- arch/arm64/stand/efiboot/efiboot.c 21 Jan 2018 21:35:34 -0000 1.14
> +++ arch/arm64/stand/efiboot/efiboot.c 28 Jan 2018 15:06:35 -0000
> @@ -355,6 +355,7 @@ efi_framebuffer(void)
> "simple-framebuffer", strlen("simple-framebuffer") + 1);
> }
>
> +char *bootmac = NULL;
> static EFI_GUID fdt_guid = FDT_TABLE_GUID;
>
> #define efi_guidcmp(_a, _b) memcmp((_a), (_b), sizeof(EFI_GUID))
> @@ -392,6 +393,10 @@ efi_makebootargs(char *bootargs)
> fdt_node_add_property(node, "openbsd,bootduid", bootduid,
> sizeof(bootduid));
> }
> +
> + /* Pass netboot interface address. */
> + if (bootmac)
> + fdt_node_add_property(node, "openbsd,bootmac", bootmac, 6);
>
> /* Pass EFI system table. */
> fdt_node_add_property(node, "openbsd,uefi-system-table",
> Index: arch/arm64/stand/efiboot/efipxe.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/arm64/stand/efiboot/efipxe.c,v
> retrieving revision 1.1
> diff -u -p -r1.1 efipxe.c
> --- arch/arm64/stand/efiboot/efipxe.c 21 Jan 2018 21:35:34 -0000 1.1
> +++ arch/arm64/stand/efiboot/efipxe.c 28 Jan 2018 15:04:31 -0000
> @@ -30,6 +30,7 @@
> extern EFI_BOOT_SERVICES *BS;
> extern EFI_DEVICE_PATH *efi_bootdp;
>
> +extern char *bootmac;
> static UINT8 boothw[16];
> static EFI_IP_ADDRESS bootip, servip;
> static EFI_GUID devp_guid = DEVICE_PATH_PROTOCOL;
> @@ -95,6 +96,7 @@ efi_pxeprobe(void)
> memcpy(&bootip, dhcp->BootpYiAddr, sizeof(bootip));
> memcpy(&servip, dhcp->BootpSiAddr, sizeof(servip));
> memcpy(boothw, dhcp->BootpHwAddr, sizeof(boothw));
> + bootmac = boothw;
> PXE = pxe;
> break;
> }
> --
> khristian "naddy" Weisgerber naddy@mips.inka.de
>
>
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic