Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 19 May 2021 11:10:08 -0600
From:      John Nielsen <lists@jnielsen.net>
To:        Jung-uk Kim <junguk.kim@gmail.com>
Cc:        "freebsd-acpi@freebsd.org" <freebsd-acpi@FreeBSD.org>
Subject:   Re: How to properly locate/parse ACPI table from kernel module?
Message-ID:  <A63CF8E2-F185-495A-99C1-421781356D8B@jnielsen.net>
In-Reply-To: <6e1f13bd-dc8f-6b30-2b62-2841deea8781@gmail.com>
References:  <BCFCDCE9-F169-4C1C-AD0C-FDE511C0BC11@jnielsen.net> <6e1f13bd-dc8f-6b30-2b62-2841deea8781@gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
> On May 17, 2021, at 2:27 PM, Jung-uk Kim <junguk.kim@gmail.com> wrote:
>=20
> On 21. 5. 17., John Nielsen wrote:
>> I=E2=80=99m not much of a kernel programmer but I=E2=80=99m trying to =
maintain/improve the isboot module, which allows booting directly from =
iSCSI by reading the iSCSI Boot Firmware Table (iBFT), bringing up the =
interface with the details specified therein and connecting to the =
specified iSCSI target before trying to mount root.
>>=20
>> I=E2=80=99m not the original author but as the port maintainer I am =
hosting the code here: https://github.com/jnielsendotnet/isboot
>>=20
>> I have a test system where the module loads but fails to find the =
iBFT. I reviewed the iBFT code and realized it has a bunch of magic =
numbers mixed in with some random memory diving. If I=E2=80=99m reading =
it right (see =
https://github.com/jnielsendotnet/isboot/blob/master/src/ibft.h#L37 and =
https://github.com/jnielsendotnet/isboot/blob/master/src/ibft.c#L521), =
it looks like it scans all of the (kernel?) memory between 512K and 1M =
in 16-byte increments looking for one beginning with the string =
=E2=80=9CiBFT=E2=80=9D, which if it finds will be used as the offset for =
reading the table. I don=E2=80=99t know where the 512K and 1M values =
came from or if they are correct, but I do have a system where that =
method does not work.
>>=20
>> IIUC, the iBFT is an ACPI table, and it seems like using ACPI to find =
it would be safer and more reliable. So my question is: how does one do =
that? Are there other places in the kernel code that do this sort of =
thing that I could use as a model? Any gotchas I should know about as a =
(less-than) novice kernel programmer?
>=20
> You may use AcpiGetTable() and AcpiPutTable(), e.g.,
>=20
> 	status =3D AcpiGetTable(ACPI_SIG_IBFT, =E2=80=A6);

Thank you (and Andriy) for your responses. Good to know that =
ACPI_SIG_IBFT is already defined in the upstream headers.

What is the second argument (=E2=80=9CInstance=E2=80=9D) of =
AcpiGetTable()? Is it just an offset in case there are multiple =
instances of a given table type?

Also, when/why should AcpiPutTable() be used?

Thanks!

JN




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?A63CF8E2-F185-495A-99C1-421781356D8B>