Hi,
"Jared D. McNeill" <[email protected]> writes:
> Module Name: src
> Committed By: jmcneill
> Date: Sat Jul 24 11:39:19 UTC 2021
>
> Modified Files:
> src/etc: MAKEDEV.tmpl
> src/etc/etc.aarch64: MAKEDEV.conf
> src/etc/etc.amd64: MAKEDEV.conf
> src/etc/etc.i386: MAKEDEV.conf
> src/sys/arch/arm/fdt: acpi_fdt.c
> src/sys/arch/x86/x86: bios32.c
> src/sys/conf: majors
> src/sys/dev: smbios.c smbiosvar.h
>
> Log Message:
> smbios: Add character device for accessing SMBIOS tables
>
> The /dev/smbios character device gives an aperture into physical memory
> that allows read-only access to the SMBIOS header and tables.
Thanks for your great work.
bios32.c fails to build for me.
My error message is as follows.
Could you take a look at my problem?
--- bios32.o ---
/usr/src/sys/arch/x86/x86/bios32.c: In function 'smbios2_map_kva':
/usr/src/sys/arch/x86/x86/bios32.c:255:33: error: passing argument 1 of
'vtophys' makes integer from pointer without a cast [-Werror=int-conversion]
255 | smbios_entry.hdrphys = vtophys(p);
| ^
| |
| const uint8_t * {aka const unsigned
char *}
In file included from ./machine/pmap.h:200,
from /usr/src/sys/uvm/uvm_pmap.h:115,
from /usr/src/sys/uvm/uvm_extern.h:533,
from /usr/src/sys/uvm/uvm.h:40,
from /usr/src/sys/arch/x86/x86/bios32.c:104:
./x86/pmap.h:534:17: note: expected 'vaddr_t' {aka 'long unsigned int'} but
argument is of type 'const uint8_t *' {aka 'const unsigned char *'}
534 | paddr_t vtophys(vaddr_t);
| ^~~~~~~
/usr/src/sys/arch/x86/x86/bios32.c: In function 'smbios3_map_kva':
/usr/src/sys/arch/x86/x86/bios32.c:290:33: error: passing argument 1 of
'vtophys' makes integer from pointer without a cast [-Werror=int-conversion]
290 | smbios_entry.hdrphys = vtophys(p);
| ^
| |
| const uint8_t * {aka const unsigned
char *}
In file included from ./machine/pmap.h:200,
from /usr/src/sys/uvm/uvm_pmap.h:115,
from /usr/src/sys/uvm/uvm_extern.h:533,
from /usr/src/sys/uvm/uvm.h:40,
from /usr/src/sys/arch/x86/x86/bios32.c:104:
./x86/pmap.h:534:17: note: expected 'vaddr_t' {aka 'long unsigned int'} but
argument is of type 'const uint8_t *' {aka 'const unsigned char *'}
534 | paddr_t vtophys(vaddr_t);
| ^~~~~~~
cc1: all warnings being treated as errors
*** Failed target: bios32.o
*** Failed commands:
${NORMAL_C}
*** [bios32.o] Error code 1
Thank you.
> To generate a diff of this commit:
> cvs rdiff -u -r1.223 -r1.224 src/etc/MAKEDEV.tmpl
> cvs rdiff -u -r1.8 -r1.9 src/etc/etc.aarch64/MAKEDEV.conf
> cvs rdiff -u -r1.32 -r1.33 src/etc/etc.amd64/MAKEDEV.conf
> cvs rdiff -u -r1.33 -r1.34 src/etc/etc.i386/MAKEDEV.conf
> cvs rdiff -u -r1.21 -r1.22 src/sys/arch/arm/fdt/acpi_fdt.c
> cvs rdiff -u -r1.5 -r1.6 src/sys/arch/x86/x86/bios32.c
> cvs rdiff -u -r1.97 -r1.98 src/sys/conf/majors
> cvs rdiff -u -r1.1 -r1.2 src/sys/dev/smbios.c src/sys/dev/smbiosvar.h
>
> Please note that diffs are not public domain; they are subject to the
> copyright notices on the relevant files.
>
> Modified files:
>
> Index: src/etc/MAKEDEV.tmpl
> diff -u src/etc/MAKEDEV.tmpl:1.223 src/etc/MAKEDEV.tmpl:1.224
> --- src/etc/MAKEDEV.tmpl:1.223 Tue Jun 29 10:22:33 2021
> +++ src/etc/MAKEDEV.tmpl Sat Jul 24 11:39:18 2021
> @@ -1,5 +1,5 @@
> #!/bin/sh -
> -# $NetBSD: MAKEDEV.tmpl,v 1.223 2021/06/29 10:22:33 nia Exp $
> +# $NetBSD: MAKEDEV.tmpl,v 1.224 2021/07/24 11:39:18 jmcneill Exp $
> #
> # Copyright (c) 2003,2007,2008 The NetBSD Foundation, Inc.
> # All rights reserved.
> @@ -2240,6 +2240,10 @@ acpi)
> mkdev acpi c %acpi_chr% 0
> ;;
>
> +smbios)
> + mkdev smbios c %smbios_chr% 0
> + ;;
> +
> midevend)
> %MI_DEVICES_END%
> local)
>
> Index: src/etc/etc.aarch64/MAKEDEV.conf
> diff -u src/etc/etc.aarch64/MAKEDEV.conf:1.8
> src/etc/etc.aarch64/MAKEDEV.conf:1.9
> --- src/etc/etc.aarch64/MAKEDEV.conf:1.8 Sun Dec 6 02:57:30 2020
> +++ src/etc/etc.aarch64/MAKEDEV.conf Sat Jul 24 11:39:18 2021
> @@ -1,4 +1,4 @@
> -# $NetBSD: MAKEDEV.conf,v 1.8 2020/12/06 02:57:30 jmcneill Exp $
> +# $NetBSD: MAKEDEV.conf,v 1.9 2021/07/24 11:39:18 jmcneill Exp $
>
> all_md)
> makedev wscons fd0 fd1 wd0 wd1 wd2 wd3 sd0 sd1 sd2 sd3
> @@ -21,6 +21,7 @@ all_md)
> makedev bpf
> makedev openfirm
> makedev acpi
> + makedev smbios
> ;;
>
> ramdisk|floppy)
>
> Index: src/etc/etc.amd64/MAKEDEV.conf
> diff -u src/etc/etc.amd64/MAKEDEV.conf:1.32
> src/etc/etc.amd64/MAKEDEV.conf:1.33
> --- src/etc/etc.amd64/MAKEDEV.conf:1.32 Sun Dec 6 02:57:30 2020
> +++ src/etc/etc.amd64/MAKEDEV.conf Sat Jul 24 11:39:18 2021
> @@ -1,4 +1,4 @@
> -# $NetBSD: MAKEDEV.conf,v 1.32 2020/12/06 02:57:30 jmcneill Exp $
> +# $NetBSD: MAKEDEV.conf,v 1.33 2021/07/24 11:39:18 jmcneill Exp $
>
> # As of 2003-04-17, the "init" case must not create more than 890 entries.
> all_md)
> @@ -46,6 +46,7 @@ all_md)
> makedev bio
> makedev xmm0
> makedev acpi
> + makedev smbios
> ;;
>
> xen)
>
> Index: src/etc/etc.i386/MAKEDEV.conf
> diff -u src/etc/etc.i386/MAKEDEV.conf:1.33 src/etc/etc.i386/MAKEDEV.conf:1.34
> --- src/etc/etc.i386/MAKEDEV.conf:1.33 Sun Dec 6 02:57:30 2020
> +++ src/etc/etc.i386/MAKEDEV.conf Sat Jul 24 11:39:19 2021
> @@ -1,4 +1,4 @@
> -# $NetBSD: MAKEDEV.conf,v 1.33 2020/12/06 02:57:30 jmcneill Exp $
> +# $NetBSD: MAKEDEV.conf,v 1.34 2021/07/24 11:39:19 jmcneill Exp $
>
> # As of 2005-03-15, the "init" case must not create more than 1024 entries.
> all_md)
> @@ -50,6 +50,7 @@ all_md)
> makedev bio
> makedev cfs
> makedev acpi
> + makedev smbios
> ;;
>
> xen)
>
> Index: src/sys/arch/arm/fdt/acpi_fdt.c
> diff -u src/sys/arch/arm/fdt/acpi_fdt.c:1.21
> src/sys/arch/arm/fdt/acpi_fdt.c:1.22
> --- src/sys/arch/arm/fdt/acpi_fdt.c:1.21 Fri Jul 23 21:33:35 2021
> +++ src/sys/arch/arm/fdt/acpi_fdt.c Sat Jul 24 11:39:19 2021
> @@ -1,4 +1,4 @@
> -/* $NetBSD: acpi_fdt.c,v 1.21 2021/07/23 21:33:35 jmcneill Exp $ */
> +/* $NetBSD: acpi_fdt.c,v 1.22 2021/07/24 11:39:19 jmcneill Exp $ */
>
> /*-
> * Copyright (c) 2015-2017 Jared McNeill <[email protected]>
> @@ -30,7 +30,7 @@
> #include "opt_efi.h"
>
> #include <sys/cdefs.h>
> -__KERNEL_RCSID(0, "$NetBSD: acpi_fdt.c,v 1.21 2021/07/23 21:33:35 jmcneill
> Exp $");
> +__KERNEL_RCSID(0, "$NetBSD: acpi_fdt.c,v 1.22 2021/07/24 11:39:19 jmcneill
> Exp $");
>
> #include <sys/param.h>
> #include <sys/bus.h>
> @@ -179,6 +179,8 @@ acpi_fdt_smbios_init(device_t dev)
> return;
> }
>
> + smbios_entry.hdrphys = smbios_table;
> +
> smbver = acpi_fdt_smbios_version();
> if (smbver == 3) {
> struct smb3hdr *sh = AcpiOsMapMemory(smbios_table, sizeof(*sh));
> @@ -188,6 +190,7 @@ acpi_fdt_smbios_init(device_t dev)
>
> ptr = AcpiOsMapMemory(sh->addr, sh->size);
> if (ptr != NULL) {
> + smbios_entry.tabphys = sh->addr;
> smbios_entry.addr = ptr;
> smbios_entry.len = sh->size;
> smbios_entry.rev = sh->eprev;
> @@ -208,6 +211,7 @@ acpi_fdt_smbios_init(device_t dev)
>
> ptr = AcpiOsMapMemory(sh->addr, sh->size);
> if (ptr != NULL) {
> + smbios_entry.tabphys = sh->addr;
> smbios_entry.addr = ptr;
> smbios_entry.len = sh->size;
> smbios_entry.rev = 0;
>
> Index: src/sys/arch/x86/x86/bios32.c
> diff -u src/sys/arch/x86/x86/bios32.c:1.5 src/sys/arch/x86/x86/bios32.c:1.6
> --- src/sys/arch/x86/x86/bios32.c:1.5 Wed Jul 21 23:16:09 2021
> +++ src/sys/arch/x86/x86/bios32.c Sat Jul 24 11:39:19 2021
> @@ -1,4 +1,4 @@
> -/* $NetBSD: bios32.c,v 1.5 2021/07/21 23:16:09 jmcneill Exp $ */
> +/* $NetBSD: bios32.c,v 1.6 2021/07/24 11:39:19 jmcneill Exp $ */
>
> /*
> * Copyright (c) 1999 The NetBSD Foundation, Inc.
> @@ -86,7 +86,7 @@
> */
>
> #include <sys/cdefs.h>
> -__KERNEL_RCSID(0, "$NetBSD: bios32.c,v 1.5 2021/07/21 23:16:09 jmcneill Exp
> $");
> +__KERNEL_RCSID(0, "$NetBSD: bios32.c,v 1.6 2021/07/24 11:39:19 jmcneill Exp
> $");
>
> #include <sys/param.h>
> #include <sys/systm.h>
> @@ -252,6 +252,8 @@ smbios2_map_kva(const uint8_t *p)
> if (eva == 0)
> return;
>
> + smbios_entry.hdrphys = vtophys(p);
> + smbios_entry.tabphys = sh->addr;
> smbios_entry.addr = (uint8_t *)(eva + (sh->addr & PGOFSET));
> smbios_entry.len = sh->size;
> smbios_entry.rev = 0;
> @@ -285,6 +287,8 @@ smbios3_map_kva(const uint8_t *p)
> if (eva == 0)
> return;
>
> + smbios_entry.hdrphys = vtophys(p);
> + smbios_entry.tabphys = sh->addr;
> smbios_entry.addr = (uint8_t *)(eva + ((vaddr_t)sh->addr & PGOFSET));
> smbios_entry.len = sh->size;
> smbios_entry.rev = sh->eprev;
>
> Index: src/sys/conf/majors
> diff -u src/sys/conf/majors:1.97 src/sys/conf/majors:1.98
> --- src/sys/conf/majors:1.97 Sun Dec 6 02:57:30 2020
> +++ src/sys/conf/majors Sat Jul 24 11:39:19 2021
> @@ -1,4 +1,4 @@
> -# $NetBSD: majors,v 1.97 2020/12/06 02:57:30 jmcneill Exp $
> +# $NetBSD: majors,v 1.98 2021/07/24 11:39:19 jmcneill Exp $
> #
> # Device majors for Machine-Independent drivers.
> #
> @@ -91,3 +91,4 @@ device-major vio9p char 356 vio9
> device-major fault char 357 fault
> device-major wwanc char 358 wwanc
> device-major acpi char 359 acpi
> +device-major smbios char 360 smbios
>
> Index: src/sys/dev/smbios.c
> diff -u src/sys/dev/smbios.c:1.1 src/sys/dev/smbios.c:1.2
> --- src/sys/dev/smbios.c:1.1 Wed Jul 21 23:16:09 2021
> +++ src/sys/dev/smbios.c Sat Jul 24 11:39:19 2021
> @@ -1,4 +1,4 @@
> -/* $NetBSD: smbios.c,v 1.1 2021/07/21 23:16:09 jmcneill Exp $ */
> +/* $NetBSD: smbios.c,v 1.2 2021/07/24 11:39:19 jmcneill Exp $ */
>
> /*
> * Copyright (c) 1999 The NetBSD Foundation, Inc.
> @@ -86,12 +86,15 @@
> */
>
> #include <sys/cdefs.h>
> -__KERNEL_RCSID(0, "$NetBSD: smbios.c,v 1.1 2021/07/21 23:16:09 jmcneill Exp
> $");
> +__KERNEL_RCSID(0, "$NetBSD: smbios.c,v 1.2 2021/07/24 11:39:19 jmcneill Exp
> $");
>
> #include <sys/param.h>
> +#include <sys/conf.h>
> #include <sys/systm.h>
> #include <sys/device.h>
>
> +#include <uvm/uvm_extern.h>
> +
> #include <dev/smbiosvar.h>
>
> #define SMBIOS_MAKESIG(a, b, c, d) \
> @@ -99,6 +102,104 @@ __KERNEL_RCSID(0, "$NetBSD: smbios.c,v 1
>
> struct smbios_entry smbios_entry;
>
> +static dev_type_read(smbios_read);
> +
> +const struct cdevsw smbios_cdevsw = {
> + .d_open = nullopen,
> + .d_close = nullclose,
> + .d_read = smbios_read,
> + .d_write = nowrite,
> + .d_ioctl = noioctl,
> + .d_stop = nostop,
> + .d_tty = notty,
> + .d_poll = nopoll,
> + .d_mmap = nommap,
> + .d_kqfilter = nokqfilter,
> + .d_discard = nodiscard,
> + .d_flag = D_OTHER | D_MPSAFE,
> +};
> +
> +static void *
> +smbios_map_memory(paddr_t pa, size_t size)
> +{
> + paddr_t spa, epa, curpa;
> + vaddr_t va, curva;
> +
> + spa = trunc_page(pa);
> + epa = round_page(pa + size);
> +
> + va = uvm_km_alloc(kernel_map, epa - spa, 0, UVM_KMF_VAONLY);
> + if (va == 0) {
> + return NULL;
> + }
> +
> + for (curpa = spa, curva = va; curpa < epa; curpa += PAGE_SIZE, curva +=
> PAGE_SIZE) {
> + pmap_kenter_pa(curva, curpa, VM_PROT_READ, PMAP_WRITE_BACK);
> + }
> + pmap_update(pmap_kernel());
> +
> + return (void *)(va + (pa - spa));
> +}
> +
> +static void
> +smbios_unmap_memory(void *va, size_t size)
> +{
> + vaddr_t ova;
> + vsize_t osz;
> +
> + ova = trunc_page((vaddr_t)va);
> + osz = round_page((vaddr_t)va + size) - ova;
> +
> + pmap_kremove(ova, osz);
> + pmap_update(pmap_kernel());
> + uvm_km_free(kernel_map, ova, osz, UVM_KMF_VAONLY);
> +}
> +
> +/*
> + * smbios_read --
> + *
> + * Read data from an SMBIOS table that resides in physical memory.
> + */
> +static int
> +smbios_read(dev_t dev, struct uio *uio, int flag)
> +{
> + paddr_t pa;
> + uint8_t *data;
> + size_t len;
> + int error;
> +
> + if (smbios_entry.addr == NULL) {
> + return EIO;
> + }
> + if (uio->uio_rw != UIO_READ) {
> + return EPERM;
> + }
> +
> + pa = uio->uio_offset;
> + if (pa == smbios_entry.hdrphys) {
> + /* SMBIOS header */
> + len = uimin(0x20, uio->uio_resid);
> +
> + } else {
> + /* Table data */
> + if (pa < smbios_entry.tabphys ||
> + pa >= smbios_entry.tabphys + smbios_entry.len) {
> + return EFAULT;
> + }
> + len = uimin(smbios_entry.len - (pa - smbios_entry.tabphys),
> + uio->uio_resid);
> + }
> +
> + data = smbios_map_memory(pa, len);
> + if (data == NULL) {
> + return ENOMEM;
> + }
> + error = uiomove(data, len, uio);
> + smbios_unmap_memory(data, len);
> +
> + return error;
> +}
> +
> int
> smbios2_check_header(const uint8_t *p)
> {
> Index: src/sys/dev/smbiosvar.h
> diff -u src/sys/dev/smbiosvar.h:1.1 src/sys/dev/smbiosvar.h:1.2
> --- src/sys/dev/smbiosvar.h:1.1 Wed Jul 21 23:16:09 2021
> +++ src/sys/dev/smbiosvar.h Sat Jul 24 11:39:19 2021
> @@ -1,4 +1,4 @@
> -/* $NetBSD: smbiosvar.h,v 1.1 2021/07/21 23:16:09 jmcneill Exp $ */
> +/* $NetBSD: smbiosvar.h,v 1.2 2021/07/24 11:39:19 jmcneill Exp $ */
> /*
> * Copyright (c) 2006 Gordon Willem Klok <[email protected]>
> * Copyright (c) 2005 Jordan Hargrave
> @@ -41,6 +41,8 @@
> #define SMBIOS_UUID_REPLEN 37 /* 16 zero padded values, 4 hyphens, 1 null */
>
> struct smbios_entry {
> + paddr_t hdrphys;
> + paddr_t tabphys;
> uint8_t rev;
> uint8_t mjr;
> uint8_t min;
>
--
Ryo ONODERA // [email protected]
PGP fingerprint = 82A2 DC91 76E0 A10A 8ABB FD1B F404 27FA C7D1 15F3