Fatal trap 12 booting FreeBSD-CURRENT via isboot kernel module.
John Nielsen
lists at jnielsen.net
Tue Feb 6 18:33:27 UTC 2018
> On Feb 6, 2018, at 10:54 AM, John Nielsen <lists at jnielsen.net> wrote:
>
>>
>> On Feb 4, 2018, at 2:50 AM, Maurizio Vairani <maurizio1018 at gmail.com> wrote:
>>
>> 2018-01-29 18:38 GMT+01:00 John Nielsen <lists at jnielsen.net>:
>> [ resending from correct email address ]
>>
>>> On Jan 29, 2018, at 6:05 AM, Maurizio Vairani <maurizio1018 at gmail.com> wrote:
>>>
>>> I am running
>>> # uname
>>> -a
>>>
>>> FreeBSD 12.0-CURRENT FreeBSD 12.0-CURRENT #0 r328383: Thu Jan 25 04:48:52
>>> UTC 2018 root at releng3.nyi.freebsd.org:/usr/obj/usr/src/amd64.amd64/sys/GENERIC
>>> amd64
>>>
>>> After compiling the kernel module as discussed in this thread :
>>> https://lists.freebsd.org/pipermail/freebsd-current/2018-January/068272.html
>>>
>>> I can boot FreeBSD via iSCSI using iPXE. But when the isboot, the iSCSI
>>> boot driver version 0.2.13, starts I receive a panic:
>>> https://mega.nz/#!tkVwBBKA!PUj14-Za6KCNaoo9hxuXORRLQoWkb4LMvTdUA1BorD4
>>>
>>> Any idea?
>>
>> Bummer!
>>
>> Aoyama-san-
>>
>> Are you still maintaining isboot? Can you help debug this issue on FreeBSD 12-CURRENT?
>>
>> Once we get it working I will update the port with whatever is needed and send you the patches in case you'd like to cut a new release.
>>
>> Thank you!
>>
>> I have solved the issue changing the function isboot_ifup() in the source file isboot.c.
>
> Here is a patch with some changes to minimize the diff. Except for the printed error messages does that look functionally equivalent?
>
> Now the question is why is this change needed and for what values of __FreeBSD_version is it appropriate?
Apparently sending a NULL socket pointer to ifioctl hasn't worked since this commit in 2011:
https://svnweb.freebsd.org/base?view=revision&revision=218757
So I'm going to add this patch to the port unconditionally once it works.
Unfortunately, I can't compile the port with either my patch below or your original replacement version of isboot_ifup(). :( Did you make other changes? Here's the error I'm getting:
--- isboot.o ---
isboot.c:425:53: error: incomplete definition of type 'struct thread'
error = socreate(AF_INET, &so, SOCK_DGRAM, 0, td->td_ucred, td);
~~^
/usr/src/sys/sys/systm.h:185:8: note: forward declaration of 'struct thread'
struct thread;
^
1 error generated.
> # diff -u isboot.c.patched1 isboot.c
> --- isboot.c.patched1 2018-02-06 10:35:20.808692000 -0700
> +++ isboot.c 2018-02-06 10:50:05.347663000 -0700
> @@ -417,28 +417,36 @@
> isboot_ifup(struct ifnet *ifp)
> {
> struct ifreq ifr;
> + struct socket *so;
> struct thread *td;
> int error;
>
> memset(&ifr, 0, sizeof(ifr));
> td = curthread;
>
> + error = socreate(AF_INET, &so, SOCK_DGRAM, 0, td->td_ucred, td);
> + if (error) {
> + printf("%s: socreate, error=%d\n", __func__, error);
> + return (error);
> + }
> +
> /* boot NIC */
> strlcpy(ifr.ifr_name, ifp->if_xname, sizeof(ifr.ifr_name));
>
> /* set IFF_UP */
> - error = ifioctl(NULL, SIOCGIFFLAGS, (caddr_t)&ifr, td);
> + error = ifioctl(so, SIOCGIFFLAGS, (caddr_t)&ifr, td);
> if (error) {
> printf("ifioctl SIOCGIFFLAGS\n");
> return (error);
> }
> ifr.ifr_flags |= IFF_UP;
> - error = ifioctl(NULL, SIOCSIFFLAGS, (caddr_t)&ifr, td);
> + error = ifioctl(so, SIOCSIFFLAGS, (caddr_t)&ifr, td);
> if (error) {
> printf("ifioctl SIOCSIFFLAGS\n");
> return (error);
> }
>
> + soclose(so);
> return (0);
> }
>
>
>> static int
>> isboot_ifup(struct ifnet *ifp)
>> {
>> struct socket *so;
>> struct ifreq ifr;
>> struct thread *td;
>> int error;
>>
>> td = curthread;
>> error = socreate(AF_INET, &so, SOCK_DGRAM, 0, td->td_ucred, td);
>> if (error) {
>> printf("%s: socreate, error=%d\n", __func__, error);
>> return (error);
>> }
>>
>> /* boot NIC */
>> memset(&ifr, 0, sizeof(ifr));
>> strlcpy(ifr.ifr_name, ifp->if_xname, sizeof(ifr.ifr_name));
>>
>> /* set IFF_UP */
>> error = ifioctl(so, SIOCGIFFLAGS, (caddr_t)&ifr, td);
>> if (error) {
>> printf("%s: ifioctl SIOCGIFFLAGS, error=%d\n", __func__, error);
>> return (error);
>> }
>>
>> ifr.ifr_flags |= IFF_UP;
>> error = ifioctl(so, SIOCSIFFLAGS, (caddr_t)&ifr, td);
>> if (error) {
>> printf("%s, ifioctl SIOCSIFFLAGS, error=%d\n", __func__, error);
>> return (error);
>> }
>> soclose(so);
>> return (0);
>> }
>>
>> I have added a socket in the ifioctl() call as in the /usr/src/sys/nfs/bootp_subr.c source.
>> Please let me know if you prefer a patch.
>> --
>> Regards,
>> Maurizio
More information about the freebsd-current
mailing list