From nobody Thu Dec 14 19:05:33 2023 X-Original-To: freebsd-arm@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4SrhdC1Wqqz53ckw for ; Thu, 14 Dec 2023 19:05:35 +0000 (UTC) (envelope-from mhorne@freebsd.org) Received: from smtp.freebsd.org (smtp.freebsd.org [96.47.72.83]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "smtp.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4SrhdC0shhz4K0L; Thu, 14 Dec 2023 19:05:35 +0000 (UTC) (envelope-from mhorne@freebsd.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1702580735; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:autocrypt:autocrypt; bh=Ew0pfUvPCQvB84U04+QXesUvsJftDeU5uC5CXn07K1M=; b=pUQYIkXfUK04TMvLfzZMsdaIixxVypf2EirTJK4ykNeGDT2ZEPKChJZAGlMnygLR1UOuVI dwnBrNxUQK8O9CsMa5PRthvcGxKppqVVLmQZt9aadFznrCfMuUVWlCIht/6USS1W9pr07d ZFWGRYr/NJFegpXOKhYrzTfAQUwQYb8G17JEQKpW6YxkmDULLSIdNPyMP5N8UsodthVMbN W3oW+dV0kDV2m7bSNa2LODjWvUOl4ZIPfr4DacFAg/WL0IQj8PHXU+ydMZgTT5Go9X+tHu RYfnl1lPmpEDe7o2G2WUq4SsZyKzF0R2ykNIBFP9mVsT4Sj/mQj+WhDpZIIUgw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1702580735; a=rsa-sha256; cv=none; b=W2WSs24hm28ugt3cq+UIZj0N1Oj+luxhxjnR5FwMT/siXB/vLgXETSKhSmvU2jrQXb00hM 942ctwvIrE2I/PwGtFp6VwsnsaDuxcHZFCfu/UUB8EV75MrRhdVlz7QbgbVxYcQS6jmSry XRzfZKZpHxelROEiyDcy/LZ6Yy4gyRemqzjgRL/BZFiMqg/pefIsSdm0dDlPO6cl70+G/o gC+FnPOZQgOuWbD+iaANttZr5NYLbZl1KfpPIhB8Nq93N4u9o5hpJ5p8jx0yg9sdMymqew 2sCX89VQa1XWxRKe2KbY744boeNaLJQCyHqPHEdZUzvLtFXqfCLTnH65pvPW3Q== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1702580735; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:autocrypt:autocrypt; bh=Ew0pfUvPCQvB84U04+QXesUvsJftDeU5uC5CXn07K1M=; b=uP1CDq5QKI7LTyXZwrNv506UzWJ3xMKjKLR+PRtOh1iLfmVvv4BK/PzqoJWB13UsClh4xy ji9ca+g2NXB8REN/BZSxtqypj0lfEvlOWKYSaDEfqbgcjCKicjqO80+vyXV7MJOMQ5fqcV 6nuImuCAXxfxOs0dbFJPNljYnEaFKW0SRDfE+FwvPUrT3Z9HtzlPx9yW9y4mfKnQnubV7E 8GJkETpjLU3g2cIDY+SU3p/Ign6q6nuairS/T9ExNzb5UZDk9YGYEo9hRFNsyJ7Pzjff3o TKRSoHg+LNfA3lwrufvR5dpqYykPxuTPMFBbF5rGB9OK6reZJeSC+/TyefX3dg== Received: from [192.168.1.151] (host-173-212-76-127.public.eastlink.ca [173.212.76.127]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: mhorne) by smtp.freebsd.org (Postfix) with ESMTPSA id 4SrhdB5pSqzsHZ; Thu, 14 Dec 2023 19:05:34 +0000 (UTC) (envelope-from mhorne@freebsd.org) Message-ID: <7853cbc5-6853-4caf-9174-6627126bc93d@freebsd.org> Date: Thu, 14 Dec 2023 15:05:33 -0400 List-Id: Porting FreeBSD to ARM processors List-Archive: https://lists.freebsd.org/archives/freebsd-arm List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-freebsd-arm@freebsd.org MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: initarm() parsing bootargs? Content-Language: en-CA To: Ronald Klop , "freebsd-arm@freebsd.org" References: <881889965.11901.1702500020716@localhost> From: Mitchell Horne Autocrypt: addr=mhorne@freebsd.org; keydata= xsBNBFyS2dQBCADdiXBG8hBVLmYbxu7aSzbwLwUf3HkGFz3rooS1kwyy+SfmjZ4UKNnl9WMx WKrJ7OAZpiNH6bLQ5nsqfx09OnpWL8c/QuPbhNdUywQoqqYpRI0K8GEn//nS9Gs0KTYwVpWb XlrzP+jf3Uh/9L5mcQmStLIH4zaaqMYHW+pMuPrvBmLIHTvLj2QjOkxslrcUdord9uvxe5Ht LU8RuTpQpHOKz705Z9/v7twFdi2HtKzpLwO6SzVyu351di1J+GihsVpcT5josQV5cHbIP3Un x+kmtKBEEc/jl/zBglF7ruWUtwgbryID+2ZPEaO1Mj+RResX4LFVMusq3uUpWRb5WJXxABEB AAHNI01pdGNoZWxsIEhvcm5lIDxtaG9ybmVARnJlZUJTRC5vcmc+wsCUBBMBCgA+AhsDBQsJ CAcCBhUKCQgLAgQWAgMBAh4BAheAFiEEkp/cYPcfabAiQvACi/gnTOdUid8FAmIyDpUFCQtC z0EACgkQi/gnTOdUid8IsQf+N8IptrrCgifT5Z0/WUVFfnHThFOKf4zBjaGswsIM8+VKsKnF 15jCWHODUHP6s+dcQ4nQi81PHPsnMfBSkGPvN/X3ess2/1KUVkH+6tAJbqXDjXhD8HT+i0NM QEFIXlLnotpgIKW3yOHjKv3ZvKw9LCvUjyNY9vOJmLk/6AbbkFh+INo65nXtQWb/hM5FVEHW S+zUoU8AqZRJoVAQfj9wmIfg/HdsxeDGKL0zkv5AwKpccvb8VJNGJbCVMgoy5uQYcUeXxcie cg0VlbFLshNQTfyhVQ85vyuHahARrUWs/k8KiYODoBnW1ChtyF8yM6VZTzSYx7pINqPq2YZy i/Htd87ATQRcktnUAQgA3zt4M4ecoQqfxpjliNLujt9klDqvmkJvWmzMuMXdzlPgGRJ0doio 9YIeEdkOt6xN0pPTK/ReCZ8WqFQ8zo23u1pwGuo0CnR58XF19wyxyUuKu/PHbt+56mC8tNHm AXsMyXQmlDqWvn/WzLY7euNRtNS4QQIwtxfM5EC4GGa5KQwxn0kM7dkUSOE/cxr+/kNbHHzb gagZR4cnNUqtPPr3dYXcibCTzgz96Lyt3/qMLXX9RTBRzu+O6E+byxWOe8ar/ZlwY2b4wTQG mhgNttkSxKtxMpZnd8+DGV/bI1P5Ct/K2GeCwNyupQGON5ymn6o7jTch+qmFX0ItkBWO4zn4 9QARAQABwsB8BBgBCgAmAhsMFiEEkp/cYPcfabAiQvACi/gnTOdUid8FAmIyDtwFCQtCz4gA CgkQi/gnTOdUid/i5gf/aQ75pJR4TJFM2vVVr6PDIwTdl0b5EchB4w4s4g/zE84XNbMOQanb BginLYEhAacLQVAvM3XdvUEhwrhaMQdjdSEB1krResL3/mbxrtKwdHSMbHA3IS3XdvxFWTB7 P5JjUSPsW6hqgoidbn4w3OxaNHhs45H2b0Nx5QiKcSyepmCZuB52gCEHnEnrdaz8TFQMXOLq 94WbTmZeIjChW3FB61m1gTf0UEFjoZAfTAUB+pbwoCa4AykIeZnDC19vjsruVU9Gy5rLglwd bjsZNfXIJGOZNEvdF8FOBwM7DlXx7SYvTJcUNoNJjOKtQ0bYGVgGqYOB/y2mTjVuKeU0eOkN Uw== In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 12/14/23 07:17, Ronald Klop wrote: > Hi, > > I'm looking into some code but it is really early in the boot path so I > find it hard to debug. Do you have some pointers? > > Booting my RPI it gets a parameter "bootargs" passed. I used this in a > driver. See the forwarded email below for the details about this. > > But in sys/arm64/arm64/machdep_boot.c I found this code. It looks likes > it would nicely get and parse this "bootargs" which is called > "linux_command_line" here. > > void > parse_fdt_bootargs(void) > { > >         if (loader_envp == NULL && > fdt_get_chosen_bootargs(linux_command_line, >             LBABI_MAX_COMMAND_LINE) == 0) { >                 init_static_kenv(static_kenv, sizeof(static_kenv)); >                 cmdline_set_env(linux_command_line, CMDLINE_GUARD); >         } > } > > But kern_getenv() does not give me any values from this "bootargs" string. > > I started adding some printf() lines from initarm() up until this method > but that is never printed. Is it too early in the boot to print anything? Yes, it is too early. In general, the console is not available until after cn_init() is called by initarm(). In the 'typical' boot case, the kernel environment is inherited from loader(8), this is done in freebsd_parse_boot_param(), and note that it sets loader_envp. This parse_fdt_bootargs() functionality was added to support the "LinuxABI" boot scheme, where the kernel is loaded and executed directly by u-boot (no loader(8)). So on arm64, parsing bootargs is skipped "by default" (loader(8) case). I think you could experiment by removing the "loader_envp == NULL" part of the conditional. What I am unsure about is if a second call to init_static_kenv() will properly append to the existing environment, or squash it. > How do others debug these pieces of code? > Mostly I try to avoid it, but it is not always possible :) When you can't easily use EARLY_PRINTF, I have resorted to running in QEMU and attaching the debugger to its GDB stub. This allows you to set breakpoints and step through code of interest before the console is available. I did not really check it, but there is some info here: https://www.qemu.org/docs/master/system/gdb.html Cheers, Mitchell > Regards, > Ronald. > > > > > -------- Forwarded Message -------- > Subject:     Re: git: 3878bbf1bb9e - main - Teach if_smsc to get MAC > from bootargs. > Date:     Wed, 13 Dec 2023 21:40:20 +0100 (CET) > From:     Ronald Klop > To:     Emmanuel Vadot > CC:     Ronald Klop > > > > *Van:* Emmanuel Vadot > *Datum:* donderdag, 7 december 2023 14:35 > *Aan:* Ronald Klop > *CC:* src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, > dev-commits-src-main@FreeBSD.org > *Onderwerp:* Re: git: 3878bbf1bb9e - main - Teach if_smsc to get MAC > from bootargs. > >     On Thu, 7 Dec 2023 11:33:05 GMT >     Ronald Klop wrote: > >      > The branch main has been updated by ronald: >      > >      > URL: > https://cgit.FreeBSD.org/src/commit/?id=3878bbf1bb9e68f8579b57cde7d4e5c77de93320 >      > >      > commit 3878bbf1bb9e68f8579b57cde7d4e5c77de93320 >      > Author:     Ronald Klop >      > AuthorDate: 2023-11-04 14:14:00 +0000 >      > Commit:     Ronald Klop >      > CommitDate: 2023-12-07 11:32:01 +0000 >      > >      >     Teach if_smsc to get MAC from bootargs. >      > >      >     Some Raspberry Pi pass smsc95xx.macaddr=XX:XX:XX:XX:XX:XX as > bootargs. >      >     Use this if no ethernet address is found in an EEPROM. >      >     As last resort fall back to ether_gen_addr() instead of > random MAC. >      > >      >     PR:     274092 >      >     Reported by:    Patrick M. Hausen (via ML) >      >     Reviewed by:    imp, karels, zlei >      >     Tested by:      Patrick M. Hausen >      >     Approved by:    karels >      >     MFC after:      1 month >      >     Relnotes:       yes >      >     Differential Revision: https://reviews.freebsd.org/D42463 > >      > --- >      >  sys/dev/usb/net/if_smsc.c | 86 > +++++++++++++++++++++++++++++++++++++++++++++-- >      >  sys/net/ethernet.h        |  1 + >      >  sys/net/if_ethersubr.c    | 10 ++++-- >      >  3 files changed, 92 insertions(+), 5 deletions(-) >      > >      > diff --git a/sys/dev/usb/net/if_smsc.c b/sys/dev/usb/net/if_smsc.c >      > index ec8197229f17..54b18e0a67c9 100644 >      > --- a/sys/dev/usb/net/if_smsc.c >      > +++ b/sys/dev/usb/net/if_smsc.c >      > @@ -179,6 +179,8 @@ static const struct usb_device_id > smsc_devs[] = { >      >  #define ETHER_IS_VALID(addr) \ >      >   (!ETHER_IS_MULTICAST(addr) && !ETHER_IS_ZERO(addr)) >      > >      > +#define BOOTARGS_SMSC95XX    "smsc95xx.macaddr" >      > + >      >  static device_probe_t smsc_probe; >      >  static device_attach_t smsc_attach; >      >  static device_detach_t smsc_detach; >      > @@ -1538,6 +1540,76 @@ smsc_ioctl(if_t ifp, u_long cmd, caddr_t > data) >      >   return (rc); >      >  } >      > >      > +#ifdef FDT >      > +static bool >      > +smsc_get_smsc95xx_macaddr(char* bootargs, size_t len, struct > usb_ether *ue) >      > +{ >      > + int values[6]; >      > + int i; >      > + char* p; >      > + >      > + p = strnstr(bootargs, BOOTARGS_SMSC95XX, len); >      > + if (p == NULL) >      > +     return (false); >      > + >      > + if (sscanf(p, BOOTARGS_SMSC95XX "=%x:%x:%x:%x:%x:%x%*c", >      > +         &values[0], &values[1], &values[2], >      > +         &values[3], &values[4], &values[5]) != 6) { >      > +     smsc_warn_printf((struct smsc_softc *)ue->ue_sc, >      > +             "invalid mac from bootargs '%s'.\n", p); >      > +     return (false); >      > + } >      > + >      > + for (i = 0; i < ETHER_ADDR_LEN; ++i) >      > +     ue->ue_eaddr[i] = values[i]; >      > + >      > + smsc_dbg_printf((struct smsc_softc *)ue->ue_sc, >      > +         "bootargs mac=%6D.\n", ue->ue_eaddr, ":"); >      > + return (true); >      > +} >      > + >      > +/** >      > + * Raspberry Pi is known to pass > smsc95xx.macaddr=XX:XX:XX:XX:XX:XX via >      > + * bootargs. >      > + */ >      > +static bool >      > +smsc_bootargs_get_mac_addr(device_t dev, struct usb_ether *ue) >      > +{ >      > + char *bootargs; >      > + ssize_t len; >      > + phandle_t node; >      > + >      > + /* only use bootargs for the first device >      > +  * to prevent duplicate mac addresses */ >      > + if (device_get_unit(dev) != 0) >      > +     return (false); >      > + node = OF_finddevice("/chosen"); >      > + if (node == -1) >      > +     return (false); >      > + if (OF_hasprop(node, "bootargs") == 0) { >      > +     smsc_dbg_printf((struct smsc_softc *)ue->ue_sc, >      > +             "bootargs not found"); >      > +     return (false); >      > + } >      > + len = OF_getprop_alloc(node, "bootargs", (void **)&bootargs); >      > + if (len == -1 || bootargs == NULL) { >      > +     smsc_warn_printf((struct smsc_softc *)ue->ue_sc, >      > +             "failed alloc for bootargs (%lu)", len); >      > +     return (false); >      > + } > >       All this can be replaced with a call to fdt_get_chosen_bootargs. >       Also we already do this for arm and arm64 in machdep_boot.c and > store >     the linux boot args in a static var called linux_command_line, maybe >     make it not static and get it from this driver. >       While you're at it make bcm2835_fbd.c and bcm2835_fb.c use this as >     they also get and parse the bootargs. > >       Cheers, > >     [...snip...] > >     -- >     Emmanuel Vadot > > > > Dear Emmanuel, > > I'm looking into this function fdt_get_chosen_bootargs. Unfortunately it > uses static memory allocation which conflicts with another remark I got > in the review. > > But what I do see is that it parses this bootargs string into > kern_setenv in sys/kern/subr_boot.c: boot_parse_arg(...). > parse_fdt_bootargs (sys/arm64/arm64/machdep_boot.c) -> cmdline_set_env > -> boot_parse_cmdline (subr_boot.c) -> boot_parse_cmdline_delim -> > boot_parse_arg > Would that be usable? > > I don't see the value in the output of kenv(1) but maybe that is not > related. > > I'll try to come up with a testcase on my RPI to see if this bootargs > ends up in kern_getenv in a parsed way. > > Regards, > Ronald. >