> Date: Tue, 18 Apr 2023 19:11:40 +0300
> From: Sergii Dmytruk <sergii.dmyt...@3mdeb.com>
> 
> Hi there,
> 
> Pinging to say that this thread is silent for 3 months.  EFI runtime and
> bootloader changes are there, /dev/efi is the last piece left to be
> committed for fwupd port to work.
> 
> Best regards,
> Sergii

Hi Sergii,

The /dev/efi support is in place as well, and as far as I can tell
your test programs worked.  I didn't find the time yet to test fwupd.
IIRC I ran into some issue building the ports you created because some
ports infrastructure changes that happend in the meantime.

Cheers,

Mark

> On Sun, Jan 08, 2023 at 12:48:05PM +0900, YASUOKA Masahiko wrote:
> > Hi,
> >
> > On Wed, 04 Jan 2023 21:52:35 +0100
> > Mark Kettenis <mark.kette...@xs4all.nl> wrote:
> > > Dear Sergii and others,
> > >
> > > I've committed the change that passes the ESRT from the bootloader to
> > > the kernel.  So now it is time to add the interfaces to the kernel to
> > > read it.  And add the interfaces to manipulate EFI variables.
> > >
> > > For those out of the loop: this could allow us to run fwupd on
> > > OpenBSD, bringing us a way to update the firmware on many machines
> > > without running through several hoops like booting Windows.
> > >
> > > What it will also allow us to do is properly set a boot option for
> > > OpenBSD and place it at the fron of the list.  Setting EFI variables
> > > is only allowed at securelevel 0 and below.
> > >
> > > This diff is an adaptation of the code that Sergii wrote:
> > >
> > >   https://marc.info/?l=openbsd-tech&m=166405001006952&w=2
> > >
> > > A few notable changes I made to that code:
> > >
> > > * This also adds support for arm64
> > >
> > > * Uses a different device major for /dev/efi since I used an unused
> > >   number in the middle of the table.
> > >
> > > * Renumbered some of the ioctls to avoid leaving a gap
> > >
> > > * Made <dev/efi/efiio.h> self-contained.
> > >
> > > * Fixed the copyright on <dev/efi/efiio.h> to match the FreeBSD file
> > >   from which significant chunks were copied.
> > >
> > > * Reworked the error handling a bit, reducing the errors to those that
> > >   actually can happen according to the EFI spec.
> > >
> > > Other than the location of the header file, this should all be
> > > consistent with the interfaces that FreeBSD and NetBSD provide.
> > >
> > > ok?
> >
> > I tested the diff roughly with the test programs from
> > https://github.com/3mdeb/openbsd-src/tree/efivars-api on my vaio.
> >
> > There is 2 tiny feedbacks.  Other than these, ok yasuoka
> >
> > Thanks,
> >
> > >
> > >
> > > Index: etc/MAKEDEV.common
> > > ===================================================================
> > > RCS file: /cvs/src/etc/MAKEDEV.common,v
> > > retrieving revision 1.118
> > > diff -u -p -r1.118 MAKEDEV.common
> > > --- etc/MAKEDEV.common    10 Nov 2022 09:50:00 -0000      1.118
> > > +++ etc/MAKEDEV.common    4 Jan 2023 19:44:01 -0000
> > > @@ -533,3 +533,5 @@ __devitem(dt, dt, Dynamic Tracer)dnl
> > >  _mkdev(dt, dt, {-M dt c major_dt_c 0 600-})dnl
> > >  __devitem(kstat, kstat, Kernel Statistics)dnl
> > >  _mkdev(kstat, kstat, {-M kstat c major_kstat_c 0 640-})dnl
> > > +__devitem(efi, efi, EFI runtime services)dnl
> > > +_mkdev(efi, efi, {-M efi c major_efi_c 0 600-})dnl
> > > Index: etc/etc.amd64/MAKEDEV
> > > ===================================================================
> > > RCS file: /cvs/src/etc/etc.amd64/MAKEDEV,v
> > > retrieving revision 1.138
> > > diff -u -p -r1.138 MAKEDEV
> > > --- etc/etc.amd64/MAKEDEV 10 Nov 2022 11:02:26 -0000      1.138
> > > +++ etc/etc.amd64/MAKEDEV 4 Jan 2023 19:44:01 -0000
> > > @@ -75,6 +75,7 @@
> > >  #        dt      Dynamic Tracer
> > >  #        diskmap Disk mapper
> > >  #        dri     Direct Rendering Infrastructure
> > > +#        efi     EFI runtime services
> > >  #        fd      fd/* nodes
> > >  #        fuse    Userland Filesystem
> > >  #        gpio*   General Purpose Input/Output
> > > @@ -358,6 +359,10 @@ fd)
> > >   MKlist[${#MKlist[*]}]=";chmod 555 fd"
> > >   ;;
> > >
> > > +efi)
> > > + M efi c 84 0 600
> > > + ;;
> > > +
> > >  dri)
> > >   RMlist[${#RMlist[*]}]=";mkdir -p dri;rm -f"
> > >   n=0
> > > @@ -593,19 +598,19 @@ local)
> > >   ;;
> > >
> > >  all)
> > > - R ipmi0 ttyVI00 ttyVI10 ttyVI20 ttyVI30 ttyVI40 dri nvram
> > > - R gpio0 gpio1 gpio2 bktr0 vnd0 vnd1 vnd2 vnd3 sd0 sd1 sd2 sd3
> > > - R sd4 sd5 sd6 sd7 sd8 sd9 cd0 cd1 rd0 tap0 tap1 tap2 tap3 tun0
> > > - R tun1 tun2 tun3 bio pty0 fd1 fd1B fd1C fd1D fd1E fd1F fd1G
> > > - R fd1H fd0 fd0B fd0C fd0D fd0E fd0F fd0G fd0H diskmap vscsi0
> > > - R ch0 audio0 audio1 audio2 audio3 kstat dt kcov bpf pvbus0
> > > - R pvbus1 vmm fuse pppac pppx hotplug ptm local wscons pci0
> > > - R pci1 pci2 pci3 uall rmidi0 rmidi1 rmidi2 rmidi3 rmidi4
> > > - R rmidi5 rmidi6 rmidi7 tuner0 radio0 speaker video0 video1 uk0
> > > - R random lpa0 lpa1 lpa2 lpt0 lpt1 lpt2 tty00 tty01 tty02 tty03
> > > - R tty04 tty05 tty06 tty07 tty08 tty09 tty0a tty0b ttyc0 ttyc1
> > > - R ttyc2 ttyc3 ttyc4 ttyc5 ttyc6 ttyc7 apm pf pctr wd0 wd1 wd2
> > > - R wd3 std st0 st1 fd
> > > + R efi0 ipmi0 ttyVI00 ttyVI10 ttyVI20 ttyVI30 ttyVI40 dri
> > > + R nvram gpio0 gpio1 gpio2 bktr0 vnd0 vnd1 vnd2 vnd3 sd0 sd1
> > > + R sd2 sd3 sd4 sd5 sd6 sd7 sd8 sd9 cd0 cd1 rd0 tap0 tap1 tap2
> > > + R tap3 tun0 tun1 tun2 tun3 bio pty0 fd1 fd1B fd1C fd1D fd1E
> > > + R fd1F fd1G fd1H fd0 fd0B fd0C fd0D fd0E fd0F fd0G fd0H
> > > + R diskmap vscsi0 ch0 audio0 audio1 audio2 audio3 kstat dt kcov
> > > + R bpf pvbus0 pvbus1 vmm fuse pppac pppx hotplug ptm local
> > > + R wscons pci0 pci1 pci2 pci3 uall rmidi0 rmidi1 rmidi2 rmidi3
> > > + R rmidi4 rmidi5 rmidi6 rmidi7 tuner0 radio0 speaker video0
> > > + R video1 uk0 random lpa0 lpa1 lpa2 lpt0 lpt1 lpt2 tty00 tty01
> > > + R tty02 tty03 tty04 tty05 tty06 tty07 tty08 tty09 tty0a tty0b
> > > + R ttyc0 ttyc1 ttyc2 ttyc3 ttyc4 ttyc5 ttyc6 ttyc7 apm pf pctr
> > > + R wd0 wd1 wd2 wd3 std st0 st1 fd
> > >   ;;
> > >
> > >  wd*|sd*)
> > > Index: etc/etc.amd64/MAKEDEV.md
> > > ===================================================================
> > > RCS file: /cvs/src/etc/etc.amd64/MAKEDEV.md,v
> > > retrieving revision 1.81
> > > diff -u -p -r1.81 MAKEDEV.md
> > > --- etc/etc.amd64/MAKEDEV.md      9 Nov 2022 19:35:23 -0000       1.81
> > > +++ etc/etc.amd64/MAKEDEV.md      4 Jan 2023 19:44:01 -0000
> > > @@ -72,6 +72,7 @@ _DEV(bpf, 23)
> > >  _DEV(dt, 30)
> > >  _DEV(diskmap, 90)
> > >  _DEV(dri, 87)
> > > +_DEV(efi, 84)
> > >  _DEV(fdesc, 22)
> > >  _DEV(fuse, 92)
> > >  _DEV(gpio, 88)
> > > @@ -137,5 +138,6 @@ target(all, nvram)dnl
> > >  target(all, dri)dnl
> > >  target(all, ttyVI, 00, 10, 20, 30, 40)dnl
> > >  target(all, ipmi, 0)dnl
> > > +target(all, efi, 0)dnl
> > >  twrget(ramd, wsdisp, ttyC, 0)dnl
> > >  target(ramd, fd, 0)dnl
> >
> > "all" target should create "efi" not "efi0".  So this must be
> >
> >   target(all, efi)dnl
> >
> > > Index: etc/etc.arm64/MAKEDEV.md
> > > ===================================================================
> > > RCS file: /cvs/src/etc/etc.arm64/MAKEDEV.md,v
> > > retrieving revision 1.15
> > > diff -u -p -r1.15 MAKEDEV.md
> > > --- etc/etc.arm64/MAKEDEV.md      9 Nov 2022 19:35:23 -0000       1.15
> > > +++ etc/etc.arm64/MAKEDEV.md      4 Jan 2023 19:44:01 -0000
> > > @@ -64,6 +64,7 @@ _DEV(bpf, 23)
> > >  _DEV(dt, 30)
> > >  _DEV(diskmap, 90)
> > >  _DEV(dri, 87)
> > > +_DEV(efi, 71)
> > >  _DEV(fdesc, 22)
> > >  _DEV(fuse, 92)
> > >  _DEV(gpio, 88)
> >
> > "target(all, efi)dnl" is missing, if it is to be the same of amd64.
> >
> > > Index: share/man/man8/man8.amd64/MAKEDEV.8
> > > ===================================================================
> > > RCS file: /cvs/src/share/man/man8/man8.amd64/MAKEDEV.8,v
> > > retrieving revision 1.96
> > > diff -u -p -r1.96 MAKEDEV.8
> > > --- share/man/man8/man8.amd64/MAKEDEV.8   10 Nov 2022 11:02:27 -0000      
> > > 1.96
> > > +++ share/man/man8/man8.amd64/MAKEDEV.8   4 Jan 2023 19:44:26 -0000
> > > @@ -1,4 +1,4 @@
> > > -.\" $OpenBSD: MAKEDEV.8,v 1.96 2022/11/10 11:02:27 krw Exp $
> > > +.\" $OpenBSD$
> > >  .\"
> > >  .\" THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.
> > >  .\" generated from:
> > > @@ -23,7 +23,7 @@
> > >  .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 
> > > OF
> > >  .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> > >  .\"
> > > -.Dd $Mdocdate: November 10 2022 $
> > > +.Dd $Mdocdate: June 6 2017 $
> > >  .Dt MAKEDEV 8 amd64
> > >  .Os
> > >  .Sh NAME
> > > @@ -221,6 +221,9 @@ Disk mapper, see
> > >  .It Ar dri
> > >  Direct Rendering Infrastructure, see
> > >  .Xr drm 4 .
> > > +.It Ar efi
> > > +EFI runtime services, see
> > > +.Xr efi 4 .
> > >  .It Ar fd
> > >  fd/* nodes, see
> > >  .Xr fd 4 .
> > > Index: sys/arch/amd64/amd64/conf.c
> > > ===================================================================
> > > RCS file: /cvs/src/sys/arch/amd64/amd64/conf.c,v
> > > retrieving revision 1.76
> > > diff -u -p -r1.76 conf.c
> > > --- sys/arch/amd64/amd64/conf.c   2 Sep 2022 20:06:55 -0000       1.76
> > > +++ sys/arch/amd64/amd64/conf.c   4 Jan 2023 19:44:26 -0000
> > > @@ -173,6 +173,7 @@ cdev_decl(pci);
> > >  #include "fuse.h"
> > >  #include "pvbus.h"
> > >  #include "ipmi.h"
> > > +#include "efi.h"
> > >
> > >  struct cdevsw    cdevsw[] =
> > >  {
> > > @@ -272,7 +273,7 @@ struct cdevsw cdevsw[] =
> > >   cdev_ptm_init(NPTY,ptm),        /* 81: pseudo-tty ptm device */
> > >   cdev_hotplug_init(NHOTPLUG,hotplug), /* 82: devices hot plugging */
> > >   cdev_acpi_init(NACPI,acpi),     /* 83: ACPI */
> > > - cdev_notdef(),
> > > + cdev_efi_init(NEFI,efi),        /* 84: EFI */
> > >   cdev_nvram_init(NNVRAM,nvram),  /* 85: NVRAM interface */
> > >   cdev_notdef(),                  /* 86 */
> > >   cdev_drm_init(NDRM,drm),        /* 87: drm */
> > > Index: sys/arch/amd64/amd64/efi_machdep.c
> > > ===================================================================
> > > RCS file: /cvs/src/sys/arch/amd64/amd64/efi_machdep.c,v
> > > retrieving revision 1.4
> > > diff -u -p -r1.4 efi_machdep.c
> > > --- sys/arch/amd64/amd64/efi_machdep.c    7 Nov 2022 01:41:57 -0000       
> > > 1.4
> > > +++ sys/arch/amd64/amd64/efi_machdep.c    4 Jan 2023 19:44:26 -0000
> > > @@ -28,21 +28,10 @@
> > >  extern paddr_t cr3_reuse_pcid;
> > >
> > >  #include <dev/efi/efi.h>
> > > -
> > > -#include <dev/clock_subr.h>
> > > +#include <machine/efivar.h>
> > >
> > >  extern EFI_MEMORY_DESCRIPTOR *mmap;
> > >
> > > -struct efi_softc {
> > > - struct device   sc_dev;
> > > - struct pmap     *sc_pm;
> > > - EFI_RUNTIME_SERVICES *sc_rs;
> > > - u_long          sc_psw;
> > > - uint64_t        sc_cr3;
> > > -
> > > - struct todr_chip_handle sc_todr;
> > > -};
> > > -
> > >  int      efi_match(struct device *, void *, void *);
> > >  void     efi_attach(struct device *, struct device *, void *);
> > >
> > > @@ -50,21 +39,12 @@ const struct cfattach efi_ca = {
> > >   sizeof(struct efi_softc), efi_match, efi_attach
> > >  };
> > >
> > > -struct cfdriver efi_cd = {
> > > - NULL, "efi", DV_DULL
> > > -};
> > > -
> > >  void     efi_map_runtime(struct efi_softc *);
> > > -void     efi_enter(struct efi_softc *);
> > > -void     efi_leave(struct efi_softc *);
> > >  int      efi_gettime(struct todr_chip_handle *, struct timeval *);
> > >  int      efi_settime(struct todr_chip_handle *, struct timeval *);
> > >
> > >  label_t efi_jmpbuf;
> > >
> > > -#define efi_enter_check(sc) (setjmp(&efi_jmpbuf) ? \
> > > -    (efi_leave(sc), EFAULT) : (efi_enter(sc), 0))
> > > -
> > >  int
> > >  efi_match(struct device *parent, void *match, void *aux)
> > >  {
> > > @@ -123,6 +103,9 @@ efi_attach(struct device *parent, struct
> > >
> > >   if ((bios_efiinfo->flags & BEI_64BIT) == 0)
> > >           return;
> > > +
> > > + if (bios_efiinfo->flags & BEI_ESRT)
> > > +         sc->sc_esrt = (void *)bios_efiinfo->config_esrt;
> > >
> > >   efi_map_runtime(sc);
> > >
> > > Index: sys/arch/amd64/conf/files.amd64
> > > ===================================================================
> > > RCS file: /cvs/src/sys/arch/amd64/conf/files.amd64,v
> > > retrieving revision 1.106
> > > diff -u -p -r1.106 files.amd64
> > > --- sys/arch/amd64/conf/files.amd64       16 Oct 2022 15:03:39 -0000      
> > > 1.106
> > > +++ sys/arch/amd64/conf/files.amd64       4 Jan 2023 19:44:26 -0000
> > > @@ -245,9 +245,9 @@ file  arch/amd64/pci/acpipci.c                acpipci
> > >  #
> > >  # EFI
> > >  #
> > > -device   efi
> > > +include "dev/efi/files.efi"
> > >  attach   efi at bios
> > > -file     arch/amd64/amd64/efi_machdep.c          efi needs-flag
> > > +file     arch/amd64/amd64/efi_machdep.c          efi
> > >
> > >  #
> > >  # VMM
> > > Index: sys/arch/amd64/include/efivar.h
> > > ===================================================================
> > > RCS file: sys/arch/amd64/include/efivar.h
> > > diff -N sys/arch/amd64/include/efivar.h
> > > --- /dev/null     1 Jan 1970 00:00:00 -0000
> > > +++ sys/arch/amd64/include/efivar.h       4 Jan 2023 19:44:26 -0000
> > > @@ -0,0 +1,42 @@
> > > +/*       $OpenBSD$       */
> > > +/*
> > > + * Copyright (c) 2022 Mark Kettenis <kette...@openbsd.org>
> > > + *
> > > + * Permission to use, copy, modify, and distribute this software for any
> > > + * purpose with or without fee is hereby granted, provided that the above
> > > + * copyright notice and this permission notice appear in all copies.
> > > + *
> > > + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 
> > > WARRANTIES
> > > + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> > > + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE 
> > > FOR
> > > + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> > > + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> > > + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 
> > > OF
> > > + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> > > + */
> > > +
> > > +#ifndef _MACHINE_EFIVAR_H_
> > > +#define _MACHINE_EFIVAR_H_
> > > +
> > > +#include <dev/clock_subr.h>
> > > +
> > > +struct efi_softc {
> > > + struct device   sc_dev;
> > > + struct pmap     *sc_pm;
> > > + EFI_RUNTIME_SERVICES *sc_rs;
> > > + EFI_SYSTEM_RESOURCE_TABLE *sc_esrt;
> > > + u_long          sc_psw;
> > > + uint64_t        sc_cr3;
> > > +
> > > + struct todr_chip_handle sc_todr;
> > > +};
> > > +
> > > +void     efi_enter(struct efi_softc *);
> > > +void     efi_leave(struct efi_softc *);
> > > +
> > > +extern label_t efi_jmpbuf;
> > > +
> > > +#define efi_enter_check(sc) (setjmp(&efi_jmpbuf) ? \
> > > +    (efi_leave(sc), EFAULT) : (efi_enter(sc), 0))
> > > +
> > > +#endif /* _MACHINE_EFIVAR_H_ */
> > > Index: sys/arch/arm64/arm64/conf.c
> > > ===================================================================
> > > RCS file: /cvs/src/sys/arch/arm64/arm64/conf.c,v
> > > retrieving revision 1.20
> > > diff -u -p -r1.20 conf.c
> > > --- sys/arch/arm64/arm64/conf.c   2 Sep 2022 20:06:55 -0000       1.20
> > > +++ sys/arch/arm64/arm64/conf.c   4 Jan 2023 19:44:27 -0000
> > > @@ -121,6 +121,7 @@ cdev_decl(pci);
> > >  #include "openprom.h"
> > >  #include "gpio.h"
> > >  #include "ipmi.h"
> > > +#include "efi.h"
> > >
> > >  struct cdevsw    cdevsw[] =
> > >  {
> > > @@ -199,7 +200,7 @@ struct cdevsw cdevsw[] =
> > >       wsmouse),
> > >   cdev_mouse_init(NWSMUX, wsmux), /* 69: ws multiplexor */
> > >   cdev_openprom_init(NOPENPROM,openprom), /* 70: /dev/openprom */
> > > - cdev_notdef(),                  /* 71: was: Cyclades-Z serial port */
> > > + cdev_efi_init(NEFI,efi),        /* 71: EFI */
> > >  #ifdef USER_PCICONF
> > >   cdev_pci_init(NPCI,pci),        /* 72: PCI user */
> > >  #else
> > > Index: sys/arch/arm64/conf/files.arm64
> > > ===================================================================
> > > RCS file: /cvs/src/sys/arch/arm64/conf/files.arm64,v
> > > retrieving revision 1.65
> > > diff -u -p -r1.65 files.arm64
> > > --- sys/arch/arm64/conf/files.arm64       17 Dec 2022 11:56:44 -0000      
> > > 1.65
> > > +++ sys/arch/arm64/conf/files.arm64       4 Jan 2023 19:44:27 -0000
> > > @@ -63,9 +63,10 @@ device simplebus: fdt
> > >  attach   simplebus at fdt
> > >  file     arch/arm64/dev/simplebus.c              simplebus
> > >
> > > -device   efi {}
> > > +# EFI
> > > +include "dev/efi/files.efi"
> > >  attach   efi at fdt
> > > -file     arch/arm64/dev/efi_machdep.c            efi needs-flag
> > > +file     arch/arm64/dev/efi_machdep.c            efi
> > >
> > >  device   smbios
> > >  attach   smbios at efi
> > > Index: sys/arch/arm64/dev/efi_machdep.c
> > > ===================================================================
> > > RCS file: /cvs/src/sys/arch/arm64/dev/efi_machdep.c,v
> > > retrieving revision 1.5
> > > diff -u -p -r1.5 efi_machdep.c
> > > --- sys/arch/arm64/dev/efi_machdep.c      6 Nov 2022 11:44:30 -0000       
> > > 1.5
> > > +++ sys/arch/arm64/dev/efi_machdep.c      4 Jan 2023 19:44:27 -0000
> > > @@ -32,8 +32,7 @@
> > >  #include <dev/ofw/fdt.h>
> > >
> > >  #include <dev/efi/efi.h>
> > > -
> > > -#include <dev/clock_subr.h>
> > > +#include <machine/efivar.h>
> > >
> > >  /*
> > >   * We need a large address space to allow identity mapping of physical
> > > @@ -50,15 +49,6 @@ extern EFI_MEMORY_DESCRIPTOR *mmap;
> > >  uint64_t efi_acpi_table;
> > >  uint64_t efi_smbios_table;
> > >
> > > -struct efi_softc {
> > > - struct device   sc_dev;
> > > - struct pmap     *sc_pm;
> > > - EFI_RUNTIME_SERVICES *sc_rs;
> > > - u_long          sc_psw;
> > > -
> > > - struct todr_chip_handle sc_todr;
> > > -};
> > > -
> > >  int      efi_match(struct device *, void *, void *);
> > >  void     efi_attach(struct device *, struct device *, void *);
> > >
> > > @@ -66,20 +56,11 @@ const struct cfattach efi_ca = {
> > >   sizeof(struct efi_softc), efi_match, efi_attach
> > >  };
> > >
> > > -struct cfdriver efi_cd = {
> > > - NULL, "efi", DV_DULL
> > > -};
> > > -
> > >  void     efi_map_runtime(struct efi_softc *);
> > > -void     efi_enter(struct efi_softc *);
> > > -void     efi_leave(struct efi_softc *);
> > >  int      efi_gettime(struct todr_chip_handle *, struct timeval *);
> > >  int      efi_settime(struct todr_chip_handle *, struct timeval *);
> > >
> > >  label_t efi_jmpbuf;
> > > -
> > > -#define efi_enter_check(sc) (setjmp(&efi_jmpbuf) ? \
> > > -    (efi_leave(sc), EFAULT) : (efi_enter(sc), 0))
> > >
> > >  int
> > >  efi_match(struct device *parent, void *match, void *aux)
> > > Index: sys/arch/arm64/include/efivar.h
> > > ===================================================================
> > > RCS file: sys/arch/arm64/include/efivar.h
> > > diff -N sys/arch/arm64/include/efivar.h
> > > --- /dev/null     1 Jan 1970 00:00:00 -0000
> > > +++ sys/arch/arm64/include/efivar.h       4 Jan 2023 19:44:27 -0000
> > > @@ -0,0 +1,41 @@
> > > +/*       $OpenBSD$       */
> > > +/*
> > > + * Copyright (c) 2022 Mark Kettenis <kette...@openbsd.org>
> > > + *
> > > + * Permission to use, copy, modify, and distribute this software for any
> > > + * purpose with or without fee is hereby granted, provided that the above
> > > + * copyright notice and this permission notice appear in all copies.
> > > + *
> > > + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 
> > > WARRANTIES
> > > + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> > > + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE 
> > > FOR
> > > + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> > > + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> > > + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 
> > > OF
> > > + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> > > + */
> > > +
> > > +#ifndef _MACHINE_EFIVAR_H_
> > > +#define _MACHINE_EFIVAR_H_
> > > +
> > > +#include <dev/clock_subr.h>
> > > +
> > > +struct efi_softc {
> > > + struct device   sc_dev;
> > > + struct pmap     *sc_pm;
> > > + EFI_RUNTIME_SERVICES *sc_rs;
> > > + EFI_SYSTEM_RESOURCE_TABLE *sc_esrt;
> > > + u_long          sc_psw;
> > > +
> > > + struct todr_chip_handle sc_todr;
> > > +};
> > > +
> > > +void     efi_enter(struct efi_softc *);
> > > +void     efi_leave(struct efi_softc *);
> > > +
> > > +extern label_t efi_jmpbuf;
> > > +
> > > +#define efi_enter_check(sc) (setjmp(&efi_jmpbuf) ? \
> > > +    (efi_leave(sc), EFAULT) : (efi_enter(sc), 0))
> > > +
> > > +#endif /* _MACHINE_EFIVAR_H_ */
> > > Index: sys/dev/efi/efi.c
> > > ===================================================================
> > > RCS file: sys/dev/efi/efi.c
> > > diff -N sys/dev/efi/efi.c
> > > --- /dev/null     1 Jan 1970 00:00:00 -0000
> > > +++ sys/dev/efi/efi.c     4 Jan 2023 19:44:27 -0000
> > > @@ -0,0 +1,284 @@
> > > +/*       $OpenBSD$       */
> > > +/*
> > > + * Copyright (c) 2022 3mdeb <cont...@3mdeb.com>
> > > + *
> > > + * Permission to use, copy, modify, and distribute this software for any
> > > + * purpose with or without fee is hereby granted, provided that the above
> > > + * copyright notice and this permission notice appear in all copies.
> > > + *
> > > + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 
> > > WARRANTIES
> > > + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> > > + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE 
> > > FOR
> > > + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> > > + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> > > + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 
> > > OF
> > > + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> > > + */
> > > +
> > > +#include <sys/param.h>
> > > +#include <sys/systm.h>
> > > +#include <sys/malloc.h>
> > > +
> > > +#include <dev/efi/efi.h>
> > > +#include <dev/efi/efiio.h>
> > > +#include <machine/efivar.h>
> > > +
> > > +struct cfdriver efi_cd = {
> > > + NULL, "efi", DV_DULL
> > > +};
> > > +
> > > +int      efiioc_get_table(struct efi_softc *sc, void *);
> > > +int      efiioc_var_get(struct efi_softc *sc, void *);
> > > +int      efiioc_var_next(struct efi_softc *sc, void *);
> > > +int      efiioc_var_set(struct efi_softc *sc, void *);
> > > +int      efi_adapt_error(EFI_STATUS);
> > > +
> > > +int
> > > +efiopen(dev_t dev, int flag, int mode, struct proc *p)
> > > +{
> > > + return (efi_cd.cd_ndevs > 0 ? 0 : ENXIO);
> > > +}
> > > +
> > > +int
> > > +eficlose(dev_t dev, int flag, int mode, struct proc *p)
> > > +{
> > > + return 0;
> > > +}
> > > +
> > > +int
> > > +efiioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
> > > +{
> > > + struct efi_softc *sc = efi_cd.cd_devs[0];
> > > + int error;
> > > +
> > > + switch (cmd) {
> > > + case EFIIOC_GET_TABLE:
> > > +         error = efiioc_get_table(sc, data);
> > > +         break;
> > > + case EFIIOC_VAR_GET:
> > > +         error = efiioc_var_get(sc, data);
> > > +         break;
> > > + case EFIIOC_VAR_NEXT:
> > > +         error = efiioc_var_next(sc, data);
> > > +         break;
> > > + case EFIIOC_VAR_SET:
> > > +         error = efiioc_var_set(sc, data);
> > > +         break;
> > > + default:
> > > +         error = ENOTTY;
> > > +         break;
> > > + }
> > > +
> > > + return error;
> > > +}
> > > +
> > > +int
> > > +efiioc_get_table(struct efi_softc *sc, void *data)
> > > +{
> > > + EFI_GUID esrt_guid = EFI_SYSTEM_RESOURCE_TABLE_GUID;
> > > + struct efi_get_table_ioc *ioc = data;
> > > + char *buf = NULL;
> > > + int error;
> > > +
> > > + /* Only ESRT is supported at the moment. */
> > > + if (memcmp(&ioc->uuid, &esrt_guid, sizeof(ioc->uuid)) != 0)
> > > +         return EINVAL;
> > > +
> > > + /* ESRT might not be present. */
> > > + if (sc->sc_esrt == NULL)
> > > +         return ENXIO;
> > > +
> > > + if (efi_enter_check(sc)) {
> > > +         free(buf, M_TEMP, ioc->table_len);
> > > +         return ENOSYS;
> > > + }
> > > +
> > > + ioc->table_len = sizeof(*sc->sc_esrt) +
> > > +     sizeof(EFI_SYSTEM_RESOURCE_ENTRY) * sc->sc_esrt->FwResourceCount;
> > > +
> > > + /* Return table length to userspace. */
> > > + if (ioc->buf == NULL) {
> > > +         efi_leave(sc);
> > > +         return 0;
> > > + }
> > > +
> > > + /* Refuse to copy only part of the table. */
> > > + if (ioc->buf_len < ioc->table_len) {
> > > +         efi_leave(sc);
> > > +         return EINVAL;
> > > + }
> > > +
> > > + buf = malloc(ioc->table_len, M_TEMP, M_WAITOK);
> > > + memcpy(buf, sc->sc_esrt, ioc->table_len);
> > > +
> > > + efi_leave(sc);
> > > +
> > > + error = copyout(buf, ioc->buf, ioc->table_len);
> > > + free(buf, M_TEMP, ioc->table_len);
> > > +
> > > + return error;
> > > +}
> > > +
> > > +int
> > > +efiioc_var_get(struct efi_softc *sc, void *data)
> > > +{
> > > + struct efi_var_ioc *ioc = data;
> > > + void *value = NULL;
> > > + efi_char *name = NULL;
> > > + size_t valuesize = ioc->datasize;
> > > + EFI_STATUS status;
> > > + int error;
> > > +
> > > + if (valuesize > 0)
> > > +         value = malloc(valuesize, M_TEMP, M_WAITOK);
> > > + name = malloc(ioc->namesize, M_TEMP, M_WAITOK);
> > > + error = copyin(ioc->name, name, ioc->namesize);
> > > + if (error != 0)
> > > +         goto leave;
> > > +
> > > + /* NULL-terminated name must fit into namesize bytes. */
> > > + if (name[ioc->namesize / sizeof(*name) - 1] != 0) {
> > > +         error = EINVAL;
> > > +         goto leave;
> > > + }
> > > +
> > > + if (efi_enter_check(sc)) {
> > > +         error = ENOSYS;
> > > +         goto leave;
> > > + }
> > > + status = sc->sc_rs->GetVariable(name, (EFI_GUID *)&ioc->vendor,
> > > +     &ioc->attrib, &ioc->datasize, value);
> > > + efi_leave(sc);
> > > +
> > > + if (status == EFI_BUFFER_TOO_SMALL) {
> > > +         /*
> > > +          * Return size of the value, which was set by EFI RT,
> > > +          * reporting no error to match FreeBSD's behaviour.
> > > +          */
> > > +         ioc->data = NULL;
> > > +         goto leave;
> > > + }
> > > +
> > > + error = efi_adapt_error(status);
> > > + if (error == 0)
> > > +         error = copyout(value, ioc->data, ioc->datasize);
> > > +
> > > +leave:
> > > + free(value, M_TEMP, valuesize);
> > > + free(name, M_TEMP, ioc->namesize);
> > > + return error;
> > > +}
> > > +
> > > +int
> > > +efiioc_var_next(struct efi_softc *sc, void *data)
> > > +{
> > > + struct efi_var_ioc *ioc = data;
> > > + efi_char *name;
> > > + size_t namesize = ioc->namesize;
> > > + EFI_STATUS status;
> > > + int error;
> > > +
> > > + name = malloc(namesize, M_TEMP, M_WAITOK);
> > > + error = copyin(ioc->name, name, namesize);
> > > + if (error)
> > > +         goto leave;
> > > +
> > > + if (efi_enter_check(sc)) {
> > > +         error = ENOSYS;
> > > +         goto leave;
> > > + }
> > > + status = sc->sc_rs->GetNextVariableName(&ioc->namesize,
> > > +     name, (EFI_GUID *)&ioc->vendor);
> > > + efi_leave(sc);
> > > +
> > > + if (status == EFI_BUFFER_TOO_SMALL) {
> > > +         /*
> > > +          * Return size of the name, which was set by EFI RT,
> > > +          * reporting no error to match FreeBSD's behaviour.
> > > +          */
> > > +         ioc->name = NULL;
> > > +         goto leave;
> > > + }
> > > +
> > > + error = efi_adapt_error(status);
> > > + if (error == 0)
> > > +         error = copyout(name, ioc->name, ioc->namesize);
> > > +
> > > +leave:
> > > + free(name, M_TEMP, namesize);
> > > + return error;
> > > +}
> > > +
> > > +int
> > > +efiioc_var_set(struct efi_softc *sc, void *data)
> > > +{
> > > + struct efi_var_ioc *ioc = data;
> > > + void *value = NULL;
> > > + efi_char *name = NULL;
> > > + EFI_STATUS status;
> > > + int error;
> > > +
> > > + /* Zero datasize means variable deletion. */
> > > + if (ioc->datasize > 0) {
> > > +         value = malloc(ioc->datasize, M_TEMP, M_WAITOK);
> > > +         error = copyin(ioc->data, value, ioc->datasize);
> > > +         if (error)
> > > +                 goto leave;
> > > + }
> > > +
> > > + name = malloc(ioc->namesize, M_TEMP, M_WAITOK);
> > > + error = copyin(ioc->name, name, ioc->namesize);
> > > + if (error)
> > > +         goto leave;
> > > +
> > > + /* NULL-terminated name must fit into namesize bytes. */
> > > + if (name[ioc->namesize / sizeof(*name) - 1] != 0) {
> > > +         error = EINVAL;
> > > +         goto leave;
> > > + }
> > > +
> > > + if (securelevel > 0) {
> > > +         error = EPERM;
> > > +         goto leave;
> > > + }
> > > +
> > > + if (efi_enter_check(sc)) {
> > > +         error = ENOSYS;
> > > +         goto leave;
> > > + }
> > > + status = sc->sc_rs->SetVariable(name, (EFI_GUID *)&ioc->vendor,
> > > +     ioc->attrib, ioc->datasize, value);
> > > + efi_leave(sc);
> > > +
> > > + error = efi_adapt_error(status);
> > > +
> > > +leave:
> > > + free(value, M_TEMP, ioc->datasize);
> > > + free(name, M_TEMP, ioc->namesize);
> > > + return error;
> > > +}
> > > +
> > > +int
> > > +efi_adapt_error(EFI_STATUS status)
> > > +{
> > > + switch (status) {
> > > + case EFI_SUCCESS:
> > > +         return 0;
> > > + case EFI_DEVICE_ERROR:
> > > +         return EIO;
> > > + case EFI_INVALID_PARAMETER:
> > > +         return EINVAL;
> > > + case EFI_NOT_FOUND:
> > > +         return ENOENT;
> > > + case EFI_OUT_OF_RESOURCES:
> > > +         return EAGAIN;
> > > + case EFI_SECURITY_VIOLATION:
> > > +         return EPERM;
> > > + case EFI_UNSUPPORTED:
> > > +         return ENOSYS;
> > > + case EFI_WRITE_PROTECTED:
> > > +         return EROFS;
> > > + default:
> > > +         return EIO;
> > > + }
> > > +}
> > > Index: sys/dev/efi/efi.h
> > > ===================================================================
> > > RCS file: /cvs/src/sys/dev/efi/efi.h,v
> > > retrieving revision 1.3
> > > diff -u -p -r1.3 efi.h
> > > --- sys/dev/efi/efi.h     18 Oct 2022 10:17:56 -0000      1.3
> > > +++ sys/dev/efi/efi.h     4 Jan 2023 19:44:27 -0000
> > > @@ -11,6 +11,12 @@
> > >  #define EFIAPI
> > >  #endif
> > >
> > > +#ifdef __LP64__
> > > +#define EFIERR(x)        (0x8000000000000000 | (x))
> > > +#else
> > > +#define EFIERR(x)        (0x80000000 | (x))
> > > +#endif
> > > +
> > >  typedef uint8_t          UINT8;
> > >  typedef int16_t          INT16;
> > >  typedef uint16_t UINT16;
> > > @@ -47,6 +53,10 @@ typedef struct {
> > >    { 0xf2fd1544, 0x9794, 0x4a2c, \
> > >      { 0x99, 0x2e, 0xe5, 0xbb, 0xcf, 0x20, 0xe3, 0x94 } }
> > >
> > > +#define EFI_SYSTEM_RESOURCE_TABLE_GUID \
> > > +  { 0xb122a263, 0x3661, 0x4f68, \
> > > +    { 0x99, 0x29, 0x78, 0xf8, 0xb0, 0xd6, 0x21, 0x80 } }
> > > +
> > >  #define EFI_GLOBAL_VARIABLE \
> > >    { 0x8be4df61, 0x93ca, 0x11d2, \
> > >      { 0xaa,0x0d,0x00,0xe0,0x98,0x03,0x2b,0x8c } }
> > > @@ -175,7 +185,33 @@ typedef struct {
> > >   EFI_CONFIGURATION_TABLE         *ConfigurationTable;
> > >  } EFI_SYSTEM_TABLE;
> > >
> > > +typedef struct {
> > > + EFI_GUID                        FwClass;
> > > + UINT32                          FwType;
> > > + UINT32                          FwVersion;
> > > + UINT32                          LowestSupportedFwVersion;
> > > + UINT32                          CapsuleFlags;
> > > + UINT32                          LastAttemptVersion;
> > > + UINT32                          LastAttemptStatus;
> > > +} EFI_SYSTEM_RESOURCE_ENTRY;
> > > +
> > > +typedef struct {
> > > + UINT32                          FwResourceCount;
> > > + UINT32                          FwResourceCountMax;
> > > + UINT64                          FwResourceVersion;
> > > + EFI_SYSTEM_RESOURCE_ENTRY       Entries[];
> > > +} EFI_SYSTEM_RESOURCE_TABLE;
> > > +
> > >  #define EFI_SUCCESS      0
> > > +
> > > +#define EFI_INVALID_PARAMETER    EFIERR(2)
> > > +#define EFI_UNSUPPORTED          EFIERR(3)
> > > +#define EFI_BUFFER_TOO_SMALL     EFIERR(5)
> > > +#define EFI_DEVICE_ERROR EFIERR(7)
> > > +#define EFI_WRITE_PROTECTED      EFIERR(8)
> > > +#define EFI_OUT_OF_RESOURCES     EFIERR(9)
> > > +#define EFI_NOT_FOUND            EFIERR(14)
> > > +#define EFI_SECURITY_VIOLATION   EFIERR(26)
> > >
> > >  #define  efi_guidcmp(_a, _b)     memcmp((_a), (_b), sizeof(EFI_GUID))
> > >
> > > Index: sys/dev/efi/efiio.h
> > > ===================================================================
> > > RCS file: sys/dev/efi/efiio.h
> > > diff -N sys/dev/efi/efiio.h
> > > --- /dev/null     1 Jan 1970 00:00:00 -0000
> > > +++ sys/dev/efi/efiio.h   4 Jan 2023 19:44:27 -0000
> > > @@ -0,0 +1,82 @@
> > > +/*       $OpenBSD$       */
> > > +/*-
> > > + * Copyright (c) 2016 Netflix, Inc.
> > > + * Copyright (c) 2022 3mdeb <cont...@3mdeb.com>
> > > + *
> > > + * Redistribution and use in source and binary forms, with or without
> > > + * modification, are permitted provided that the following conditions
> > > + * are met:
> > > + * 1. Redistributions of source code must retain the above copyright
> > > + *    notice, this list of conditions and the following disclaimer
> > > + *    in this position and unchanged.
> > > + * 2. Redistributions in binary form must reproduce the above copyright
> > > + *    notice, this list of conditions and the following disclaimer in the
> > > + *    documentation and/or other materials provided with the 
> > > distribution.
> > > + *
> > > + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> > > + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
> > > WARRANTIES
> > > + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
> > > DISCLAIMED.
> > > + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> > > + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
> > > BUT
> > > + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 
> > > USE,
> > > + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> > > + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> > > + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
> > > OF
> > > + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> > > + */
> > > +
> > > +#ifndef _DEV_EFI_EFIIO_H_
> > > +#define _DEV_EFI_EFIIO_H_
> > > +
> > > +#include <sys/types.h>
> > > +#include <sys/ioccom.h>
> > > +#include <sys/uuid.h>
> > > +
> > > +typedef uint16_t efi_char;
> > > +
> > > +#define EFI_TABLE_ESRT                                   \
> > > + {0xb122a263,0x3661,0x4f68,0x99,0x29,{0x78,0xf8,0xb0,0xd6,0x21,0x80}}
> > > +
> > > +struct efi_esrt_table {
> > > + uint32_t        fw_resource_count;
> > > + uint32_t        fw_resource_count_max;
> > > + uint64_t        fw_resource_version;
> > > +#define ESRT_FIRMWARE_RESOURCE_VERSION 1
> > > + uint8_t         entries[];
> > > +};
> > > +
> > > +struct efi_esrt_entry_v1 {
> > > + struct uuid     fw_class;
> > > + uint32_t        fw_type;
> > > + uint32_t        fw_version;
> > > + uint32_t        lowest_supported_fw_version;
> > > + uint32_t        capsule_flags;
> > > + uint32_t        last_attempt_version;
> > > + uint32_t        last_attempt_status;
> > > +};
> > > +
> > > +struct efi_get_table_ioc
> > > +{
> > > + void *buf;              /* Pointer to userspace buffer */
> > > + struct uuid uuid;       /* UUID to look up */
> > > + size_t table_len;       /* Table size */
> > > + size_t buf_len;         /* Size of the buffer */
> > > +};
> > > +
> > > +struct efi_var_ioc
> > > +{
> > > + uint16_t *name;         /* User pointer to name, in UCS2 chars */
> > > + size_t namesize;        /* Number of *bytes* in the name including
> > > +                            terminator */
> > > + struct uuid vendor;     /* Vendor's UUID for variable */
> > > + uint32_t attrib;        /* Attributes */
> > > + void *data;             /* User pointer to value */
> > > + size_t datasize;        /* Number of *bytes* in the value */
> > > +};
> > > +
> > > +#define EFIIOC_GET_TABLE _IOWR('E',  1, struct efi_get_table_ioc)
> > > +#define EFIIOC_VAR_GET           _IOWR('E',  2, struct efi_var_ioc)
> > > +#define EFIIOC_VAR_NEXT          _IOWR('E',  3, struct efi_var_ioc)
> > > +#define EFIIOC_VAR_SET           _IOWR('E',  4, struct efi_var_ioc)
> > > +
> > > +#endif /* _DEV_EFI_EFIIO_H_ */
> > > Index: sys/dev/efi/files.efi
> > > ===================================================================
> > > RCS file: sys/dev/efi/files.efi
> > > diff -N sys/dev/efi/files.efi
> > > --- /dev/null     1 Jan 1970 00:00:00 -0000
> > > +++ sys/dev/efi/files.efi 4 Jan 2023 19:44:27 -0000
> > > @@ -0,0 +1,7 @@
> > > +#        $OpenBSD: files.acpi,v 1.67 2022/11/06 15:36:13 patrick Exp $
> > > +#
> > > +# Config file and device description for machine-independent ACPI code.
> > > +# Included by ports that need it.
> > > +
> > > +device   efi {}
> > > +file     dev/efi/efi.c           efi needs-flag
> > > Index: sys/sys/conf.h
> > > ===================================================================
> > > RCS file: /cvs/src/sys/sys/conf.h,v
> > > retrieving revision 1.160
> > > diff -u -p -r1.160 conf.h
> > > --- sys/sys/conf.h        6 Nov 2022 13:03:52 -0000       1.160
> > > +++ sys/sys/conf.h        4 Jan 2023 19:44:29 -0000
> > > @@ -481,6 +481,13 @@ extern struct cdevsw cdevsw[];
> > >   (dev_type_stop((*))) enodev, 0, (dev_type_mmap((*))) enodev, \
> > >   0, 0, seltrue_kqfilter }
> > >
> > > +/* open, close, ioctl */
> > > +#define cdev_efi_init(c,n) { \
> > > + dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \
> > > + (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
> > > + (dev_type_stop((*))) enodev, 0, \
> > > + (dev_type_mmap((*))) enodev }
> > > +
> > >  /* open, close, ioctl, mmap */
> > >  #define cdev_kcov_init(c,n) { \
> > >   dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \
> > > @@ -632,6 +639,7 @@ cdev_decl(amdmsr);
> > >  cdev_decl(fuse);
> > >  cdev_decl(pvbus);
> > >  cdev_decl(ipmi);
> > > +cdev_decl(efi);
> > >  cdev_decl(kcov);
> > >
> > >  #endif
> 
> 


Reply via email to