Hi,

"Jared D. McNeill" <jmcne...@netbsd.org> 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 <jmcne...@invisible.ca>
> @@ -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 <gk...@cogeco.ca>
>   * 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 // r...@tetera.org
PGP fingerprint = 82A2 DC91 76E0 A10A 8ABB  FD1B F404 27FA C7D1 15F3

Reply via email to