In message <202509142159.58elx5rg054...@gitrepo.freebsd.org>, Aymeric Wibo writ
es:
> The branch main has been updated by obiwac:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=e779891327b1d9b9ab10ba482e59f498
> 790505a7
>
> commit e779891327b1d9b9ab10ba482e59f498790505a7
> Author:     Aymeric Wibo <obi...@freebsd.org>
> AuthorDate: 2025-09-14 21:58:13 +0000
> Commit:     Aymeric Wibo <obi...@freebsd.org>
> CommitDate: 2025-09-14 21:58:15 +0000
>
>     sys/power: Sleep type reporting by PM backends
>     
>     Allow PM backends to report supported sleep types when registering
>     through `power_pm_register`. Expose this information through
>     `kern.power.supported_stype` sysctl, and set defaults for
>     `power_standby/suspend/hibernate_stype` based on this.
>     
>     Implement this in ACPI PM backend.
>     
>     Reviewed by:    mckusick (mentor), markj
>     Approved by:    mckusick (mentor), markj
>     Sponsored by:   The FreeBSD Foundation
>     Differential Revision:  https://reviews.freebsd.org/D52044
> ---
>  sys/dev/acpica/acpi.c |  6 ++++--
>  sys/kern/subr_power.c | 46 +++++++++++++++++++++++++++++++++++++++++-----
>  sys/sys/power.h       |  3 ++-
>  3 files changed, 47 insertions(+), 8 deletions(-)
>
> diff --git a/sys/dev/acpica/acpi.c b/sys/dev/acpica/acpi.c
> index 8dd879a573cc..702e1ecb5340 100644
> --- a/sys/dev/acpica/acpi.c
> +++ b/sys/dev/acpica/acpi.c
> @@ -734,7 +734,8 @@ acpi_attach(device_t dev)
>       goto out;
>  
>      /* Register ACPI again to pass the correct argument of pm_func. */
> -    power_pm_register(POWER_PM_TYPE_ACPI, acpi_pm_func, sc);
> +    power_pm_register(POWER_PM_TYPE_ACPI, acpi_pm_func, sc,
> +     acpi_supported_stypes);
>  
>      acpi_platform_osc(dev);
>  
> @@ -4776,7 +4777,8 @@ acpi_pm_register(void *arg)
>      if (!cold || resource_disabled("acpi", 0))
>       return;
>  
> -    power_pm_register(POWER_PM_TYPE_ACPI, acpi_pm_func, NULL);
> +    power_pm_register(POWER_PM_TYPE_ACPI, acpi_pm_func, NULL,
> +     acpi_supported_stypes);
>  }
>  
>  SYSINIT(power, SI_SUB_KLD, SI_ORDER_ANY, acpi_pm_register, NULL);
> diff --git a/sys/kern/subr_power.c b/sys/kern/subr_power.c
> index eb5bd03f5018..44ad82860649 100644
> --- a/sys/kern/subr_power.c
> +++ b/sys/kern/subr_power.c
> @@ -39,13 +39,14 @@
>  #include <sys/systm.h>
>  #include <sys/taskqueue.h>
>  
> -enum power_stype      power_standby_stype    = POWER_STYPE_STANDBY;
> -enum power_stype      power_suspend_stype    = POWER_STYPE_SUSPEND_TO_IDLE;
> -enum power_stype      power_hibernate_stype  = POWER_STYPE_HIBERNATE;
> +enum power_stype      power_standby_stype    = POWER_STYPE_UNKNOWN;
> +enum power_stype      power_suspend_stype    = POWER_STYPE_UNKNOWN;
> +enum power_stype      power_hibernate_stype  = POWER_STYPE_UNKNOWN;
>  
>  static u_int          power_pm_type  = POWER_PM_TYPE_NONE;
>  static power_pm_fn_t  power_pm_fn    = NULL;
>  static void          *power_pm_arg   = NULL;
> +static bool           power_pm_supported[POWER_STYPE_COUNT] = {0};
>  static struct task    power_pm_task;
>  
>  enum power_stype
> @@ -70,6 +71,26 @@ power_stype_to_name(enum power_stype stype)
>       return (power_stype_names[stype]);
>  }
>  
> +static int
> +sysctl_supported_stypes(SYSCTL_HANDLER_ARGS)
> +{
> +     int error;
> +     struct sbuf sb;
> +     enum power_stype stype;
> +
> +     sbuf_new(&sb, NULL, 32, SBUF_AUTOEXTEND);
> +     for (stype = 0; stype < POWER_STYPE_COUNT; stype++) {
> +             if (power_pm_supported[stype])
> +                     sbuf_printf(&sb, "%s ", power_stype_to_name(stype));
> +     }
> +     sbuf_trim(&sb);
> +     sbuf_finish(&sb);
> +     error = sysctl_handle_string(oidp, sbuf_data(&sb), sbuf_len(&sb), req);
> +     sbuf_delete(&sb);
> +
> +     return (error);
> +}
> +
>  static int
>  power_sysctl_stype(SYSCTL_HANDLER_ARGS)
>  {
> @@ -86,7 +107,8 @@ power_sysctl_stype(SYSCTL_HANDLER_ARGS)
>       new_stype = power_name_to_stype(name);
>       if (new_stype == POWER_STYPE_UNKNOWN)
>               return (EINVAL);
> -     /* TODO Check to see if the new stype is supported. */
> +     if (!power_pm_supported[new_stype])
> +             return (EOPNOTSUPP);
>       if (new_stype != old_stype)
>               *(enum power_stype *)oidp->oid_arg1 = new_stype;
>       return (0);
> @@ -95,6 +117,9 @@ power_sysctl_stype(SYSCTL_HANDLER_ARGS)
>  static SYSCTL_NODE(_kern, OID_AUTO, power, CTLFLAG_RW, 0,
>      "Generic power management related sysctls");
>  
> +SYSCTL_PROC(_kern_power, OID_AUTO, supported_stype,
> +    CTLTYPE_STRING | CTLFLAG_RD, 0, 0, sysctl_supported_stypes, "A",
> +    "List supported sleep types");
>  SYSCTL_PROC(_kern_power, OID_AUTO, standby, CTLTYPE_STRING | CTLFLAG_RW,
>      &power_standby_stype, 0, power_sysctl_stype, "A",
>      "Sleep type to enter on standby");
> @@ -114,7 +139,8 @@ power_pm_deferred_fn(void *arg, int pending)
>  }
>  
>  int
> -power_pm_register(u_int pm_type, power_pm_fn_t pm_fn, void *pm_arg)
> +power_pm_register(u_int pm_type, power_pm_fn_t pm_fn, void *pm_arg,
> +    bool pm_supported[static POWER_STYPE_COUNT])
>  {
>       int     error;
>  
> @@ -123,6 +149,16 @@ power_pm_register(u_int pm_type, power_pm_fn_t pm_fn, vo
> id *pm_arg)
>               power_pm_type   = pm_type;
>               power_pm_fn     = pm_fn;
>               power_pm_arg    = pm_arg;
> +             memcpy(power_pm_supported, pm_supported,
> +                 sizeof(power_pm_supported));
> +             if (power_pm_supported[POWER_STYPE_STANDBY])
> +                     power_standby_stype = POWER_STYPE_STANDBY;
> +             if (power_pm_supported[POWER_STYPE_SUSPEND_TO_IDLE])
> +                     power_suspend_stype = POWER_STYPE_SUSPEND_TO_IDLE;
> +             else if (power_pm_supported[POWER_STYPE_SUSPEND_TO_MEM])
> +                     power_suspend_stype = POWER_STYPE_SUSPEND_TO_MEM;
> +             if (power_pm_supported[POWER_STYPE_HIBERNATE])
> +                     power_hibernate_stype = POWER_STYPE_HIBERNATE;
>               error = 0;
>               TASK_INIT(&power_pm_task, 0, power_pm_deferred_fn, NULL);
>       } else {
> diff --git a/sys/sys/power.h b/sys/sys/power.h
> index 44d7fc354423..33ace400bfd2 100644
> --- a/sys/sys/power.h
> +++ b/sys/sys/power.h
> @@ -91,7 +91,8 @@ extern const char   *power_stype_to_name(enum power_stype _
> stype);
>  
>  typedef int (*power_pm_fn_t)(u_long _cmd, void* _arg, enum power_stype _styp
> e);
>  extern int    power_pm_register(u_int _pm_type, power_pm_fn_t _pm_fn,
> -                     void *_pm_arg);
> +                     void *_pm_arg,
> +                     bool _pm_supported[static POWER_STYPE_COUNT]);
>  extern u_int  power_pm_get_type(void);
>  extern void   power_pm_suspend(int);
>  
>

One of this series of ACPI commits has broken power management on my machines.
One of which managed to capture a dump from a kernel panic after poweroff(8)
was issued.

__curthread () at /opt/src/git-src/sys/amd64/include/pcpu_aux.h:57
57              __asm("movq %%gs:%c1,%0" : "=r" (td)
(kgdb) #0  __curthread () at /opt/src/git-src/sys/amd64/include/pcpu_aux.h:57  
        td = <optimized out>
#1  doadump (textdump=textdump@entry=1)
    at /opt/src/git-src/sys/kern/kern_shutdown.c:399
        error = 0
        coredump = <optimized out>
#2  0xffffffff8070d320 in kern_reboot (howto=260)
    at /opt/src/git-src/sys/kern/kern_shutdown.c:519
        once = 1
        __pc = 0x0
#3  0xffffffff8070d857 in vpanic (fmt=0xffffffff80b8e00c "%s",
    ap=ap@entry=0xfffffe008a636960)
    at /opt/src/git-src/sys/kern/kern_shutdown.c:974
        buf = "page fault", '\000' <repeats 245 times>
        __pc = 0x0
        __pc = 0x0
        __pc = 0x0
        other_cpus = {__bits = {14, 0 <repeats 15 times>}}
        td = 0xfffff80006607000
        bootopt = <unavailable>
        newpanic = <optimized out>
#4  0xffffffff8070d683 in panic (fmt=<unavailable>)
    at /opt/src/git-src/sys/kern/kern_shutdown.c:887
        ap = {{gp_offset = 16, fp_offset = 48,
            overflow_arg_area = 0xfffffe008a636990,
            reg_save_area = 0xfffffe008a636930}}
#5  0xffffffff80aeb4bc in trap_fatal (frame=<optimized out>,
    eva=<optimized out>) at /opt/src/git-src/sys/amd64/amd64/trap.c:969
        type = <optimized out>
        handled = <optimized out>
#6  0xffffffff80aeb4bc in trap_pfault (frame=0xfffffe008a636a00,  
    usermode=false, signo=<optimized out>, ucode=<optimized out>)
        __pc = 0x0
        __pc = 0x0
        __pc = 0x0
        td = <optimized out>
        p = <optimized out>
        eva = 136
        map = <optimized out>
        ftype = <optimized out>
        rv = <optimized out>
#7  <signal handler called>
No locals.
#8  device_get_softc (dev=dev@entry=0x0)
    at /opt/src/git-src/sys/kern/subr_bus.c:2141
No locals.
#9  0xffffffff80429385 in acpi_wake_sleep_prep (handle=0xfffff80007706e00,
    stype=POWER_STYPE_POWEROFF) at /opt/src/git-src/sys/dev/acpica/acpi.c:3689
        prw = {gpe_handle = 0x0, gpe_bit = 27, lowest_wake = 3, power_res = {{
              Type = 0, Integer = {Type = 0, Value = 0}, String = {Type = 0,
                Length = 0, Pointer = 0x0}, Buffer = {Type = 0, Length = 0,
                Pointer = 0x0}, Package = {Type = 0, Count = 0,
                Elements = 0x0}, Reference = {Type = 0, ActualType = 0,
                Handle = 0x0}, Processor = {Type = 0, ProcId = 0,
                PblkAddress = 0, PblkLength = 87678488}, PowerResource = {
                Type = 0, SystemLevel = 0, ResourceOrder = 0}}, {Type = 369,
              Integer = {Type = 369, Value = 8}, String = {Type = 369,
                Length = 0,
                Pointer = 0x8 <error: Cannot access memory at address 0x8>},
              Buffer = {Type = 369, Length = 0,
                Pointer = 0x8 <error: Cannot access memory at address 0x8>},
              Buffer = {Type = 369, Length = 0,
                Pointer = 0x8 <error: Cannot access memory at address 0x8>},
              Package = {Type = 369, Count = 0, Elements = 0x8}, Reference = {
                Type = 369, ActualType = 0, Handle = 0x8}, Processor = {
                Type = 369, ProcId = 0, PblkAddress = 8, PblkLength = 0},
              PowerResource = {Type = 369, SystemLevel = 0,
                ResourceOrder = 8}}, {Type = 2159484735, Integer = {
                Type = 2159484735, Value = 0}, String = {Type = 2159484735,
                Length = 4294967295, Pointer = 0x0}, Buffer = {
                Type = 2159484735, Length = 4294967295, Pointer = 0x0},
              Package = {Type = 2159484735, Count = 4294967295,
                Elements = 0x0}, Reference = {Type = 2159484735,
                ActualType = 4294967295, Handle = 0x0}, Processor = {
                Type = 2159484735, ProcId = 4294967295, PblkAddress = 0,
                PblkLength = 87678488}, PowerResource = {Type = 2159484735,
                SystemLevel = 4294967295, ResourceOrder = 0}}, {Type = 458,
              Integer = {Type = 458, Value = 8}, String = {Type = 458,
                Length = 0,
                Pointer = 0x8 <error: Cannot access memory at address 0x8>},
              Buffer = {Type = 458, Length = 0,
                Pointer = 0x8 <error: Cannot access memory at address 0x8>},
              Package = {Type = 458, Count = 0, Elements = 0x8}, Reference = {
                Type = 458, ActualType = 0, Handle = 0x8}, Processor = {
                Type = 458, ProcId = 0, PblkAddress = 8, PblkLength = 0},
              PowerResource = {Type = 458, SystemLevel = 0,
                ResourceOrder = 8}}, {Type = 2159484735, Integer = {
                Type = 2159484735, Value = 18446741877008067488}, String = {
                Type = 2159484735, Length = 4294967295,
                Pointer = 0xfffffe008a636ba0 "\300kc\212"}, Buffer = {
                Type = 2159484735, Length = 4294967295,
                Pointer = 0xfffffe008a636ba0 "\300kc\212"}, Package = {
                Type = 2159484735, Count = 4294967295,
                Elements = 0xfffffe008a636ba0}, Reference = {
                Type = 2159484735, ActualType = 4294967295,
                Handle = 0xfffffe008a636ba0}, Processor = {Type = 2159484735,
                ProcId = 4294967295, PblkAddress = 18446741877008067488,
                PblkLength = 2154715683}, PowerResource = {Type = 2159484735,
                SystemLevel = 4294967295, ResourceOrder = 2321771424}}, {
              Type = 87678488, Integer = {Type = 87678488,
                Value = 18446735277723512832}, String = {Type = 87678488,
                Length = 4294965248,
                Pointer = 0xfffff80006607000 "\300\321G\204\377\377\377\377\020 
"}, Buffer = {Type = 87678488, Length =
 4294965248,
                Pointer = 0xfffff80006607000 "\300\321G\204\377\377\377\377\020 
"}, Package = {Type = 87678488, Count =
 4294965248,
                Elements = 0xfffff80006607000}, Reference = {Type = 87678488,
                ActualType = 4294965248, Handle = 0xfffff80006607000},
              Processor = {Type = 87678488, ProcId = 4294965248,
                PblkAddress = 18446735277723512832, PblkLength = 87678464},
              PowerResource = {Type = 87678488, SystemLevel = 4294965248,
                ResourceOrder = 106983424}}, {Type = 663, Integer = {
                Type = 663, Value = 18446735277704207896}, String = {
                Type = 663, Length = 0, Pointer = 0xfffff8000539de18 ""},
              Buffer = {Type = 663, Length = 0,
                Pointer = 0xfffff8000539de18 ""}, Package = {Type = 663,
                Count = 0, Elements = 0xfffff8000539de18}, Reference = {
                Type = 663, ActualType = 0, Handle = 0xfffff8000539de18},
              Processor = {Type = 663, ProcId = 0,
                PblkAddress = 18446735277704207896, PblkLength = 2165581152},
              PowerResource = {Type = 663, SystemLevel = 0,
                ResourceOrder = 87678488}}, {Type = 87678464, Integer = {
                Type = 87678464, Value = 8}, String = {Type = 87678464,
                Length = 4294965248,
                Pointer = 0x8 <error: Cannot access memory at address 0x8>},
              Buffer = {Type = 87678464, Length = 4294965248,
                Pointer = 0x8 <error: Cannot access memory at address 0x8>},
              Package = {Type = 87678464, Count = 4294965248, Elements = 0x8},
              Reference = {Type = 87678464, ActualType = 4294965248,
                Handle = 0x8}, Processor = {Type = 87678464,
                ProcId = 4294965248, PblkAddress = 8,
                PblkLength = 2321771456}, PowerResource = {Type = 87678464,
                SystemLevel = 4294965248, ResourceOrder = 8}}},
          power_res_count = 0}
        dev = 0x0
        sc = <optimized out>
        sstate = <optimized out>
#10 acpi_wake_prep (handle=0xfffff80007706e00, level=<optimized out>,
    context=<optimized out>, status=<optimized out>)
    at /opt/src/git-src/sys/dev/acpica/acpi.c:3764
        stype = POWER_STYPE_POWEROFF
#11 0xffffffff803756db in AcpiNsWalkNamespace (Type=Type@entry=6,
    StartNode=<optimized out>, StartNode@entry=0xfffff800050b3880,
    MaxDepth=MaxDepth@entry=100, Flags=Flags@entry=1,
    DescendingCallback=DescendingCallback@entry=0xffffffff80429320 
<acpi_wake_prep>, AscendingCallback=AscendingCallbac
k@entry=0x0,
    Context=0xfffffe008a636ce4, ReturnValue=0x0)
    at /opt/src/git-src/sys/contrib/dev/acpica/components/namespace/nswalk.c:484
        NodePreviouslyVisited = 0 '\000'
        ParentNode = 0xfffff800050b14c0
        ChildNode = 0xfffff80007706e00
        ChildType = 6
        Level = 2
        Status = 0
        MutexStatus = <optimized out>
#12 0xffffffff80375c45 in AcpiWalkNamespace (Type=Type@entry=6,
    StartObject=0xfffff800050b3880, MaxDepth=MaxDepth@entry=100,
    DescendingCallback=0xffffffff80429320 <acpi_wake_prep>,
    AscendingCallback=AscendingCallback@entry=0x0,
    Context=Context@entry=0xfffffe008a636ce4, ReturnValue=<optimized out>)
    at 
/opt/src/git-src/sys/contrib/dev/acpica/components/namespace/nsxfeval.c:809
        Status = 0
#13 0xffffffff80426384 in acpi_wake_prep_walk (stype=POWER_STYPE_POWEROFF)
    at /opt/src/git-src/sys/dev/acpica/acpi.c:3777
        sb_handle = 0xfffff800050b3880
#14 acpi_shutdown (dev=0xfffff80007716e00)
    at /opt/src/git-src/sys/dev/acpica/acpi.c:878
No locals.
#15 0xffffffff8074c706 in DEVICE_SHUTDOWN (dev=0xfffff80007716e00)
    at ./device_if.h:262
        rc = <optimized out>
        _m = <optimized out>
        _cep = <optimized out>
        _ce = <optimized out>
        _desc = <optimized out>
#16 device_shutdown (dev=0xfffff80007716e00)
    at /opt/src/git-src/sys/kern/subr_bus.c:2753
No locals.
#17 bus_generic_shutdown (dev=<optimized out>)
    at /opt/src/git-src/sys/kern/subr_bus.c:3563
        child = <optimized out>
#18 0xffffffff8074c706 in DEVICE_SHUTDOWN (dev=0xfffff800051b8200)
    at ./device_if.h:262
        rc = <optimized out>
        _m = <optimized out>
        _cep = <optimized out>
        _ce = <optimized out>
#16 device_shutdown (dev=0xfffff80007716e00)
    at /opt/src/git-src/sys/kern/subr_bus.c:2753
No locals.
#17 bus_generic_shutdown (dev=<optimized out>)
    at /opt/src/git-src/sys/kern/subr_bus.c:3563
        child = <optimized out>
#18 0xffffffff8074c706 in DEVICE_SHUTDOWN (dev=0xfffff800051b8200)
    at ./device_if.h:262
        rc = <optimized out>
        _m = <optimized out>
        _cep = <optimized out>
        _ce = <optimized out>
        _desc = <optimized out>
#19 device_shutdown (dev=0xfffff800051b8200)
    at /opt/src/git-src/sys/kern/subr_bus.c:2753
No locals.
#20 bus_generic_shutdown (dev=<optimized out>)
    at /opt/src/git-src/sys/kern/subr_bus.c:3563
        child = <optimized out>
#21 0xffffffff80750d06 in DEVICE_SHUTDOWN (dev=0xfffff800051b8500)
    at ./device_if.h:262
        rc = <optimized out>
        _m = <optimized out>
        _cep = <optimized out>
        _ce = <optimized out>
        _desc = <optimized out>
#22 device_shutdown (dev=0xfffff800051b8500)
    at /opt/src/git-src/sys/kern/subr_bus.c:2753
No locals.
#23 root_bus_module_handler (mod=<optimized out>, what=<optimized out>,
    arg=<optimized out>) at /opt/src/git-src/sys/kern/subr_bus.c:5211
No locals.
#24 0xffffffff806e534b in module_shutdown (arg1=<optimized out>,
    arg2=<optimized out>) at /opt/src/git-src/sys/kern/kern_module.c:101
        mod = 0xfffff800051d3b00
#25 0xffffffff8070d3d3 in kern_reboot (howto=16392)
    at /opt/src/git-src/sys/kern/kern_shutdown.c:527
        _ep = <optimized out>
        _t = 0xfffff800050e9f40
        _el = 0xfffff800050e4600
        once = 1
        __pc = 0x0
#26 0xffffffff8070cd9c in sys_reboot (td=0xfffff80006607000,
    uap=0xfffff80006607428) at /opt/src/git-src/sys/kern/kern_shutdown.c:308
        error = 5
#27 0xffffffff80aebe69 in syscallenter (td=0xfffff80006607000)
    at /opt/src/git-src/sys/amd64/amd64/../../kern/subr_syscall.c:193
        se = 0xffffffff81054310 <sysent+1760>
        p = 0xfffffe0081002010
        sa = 0xfffff80006607418
        error = <optimized out>
        sy_thr_static = true
        traced = <optimized out>
        _audit_entered = <optimized out>
#28 amd64_syscall (td=0xfffff80006607000, traced=0)
    at /opt/src/git-src/sys/amd64/amd64/trap.c:1208
        ksi = {ksi_link = {tqe_next = 0xfffffe008a636f30,
            tqe_prev = 0xffffffff80aeae4d <trap+2173>}, ksi_info = {
            si_signo = -1973195040, si_errno = -512, si_code = -2139594896,
            si_pid = -1, si_uid = 25088, si_status = -2047,
            si_addr = 0x800000000000, si_value = {sival_int = -860430388,
              sival_ptr = 0x326493c1ccb6dfcc, sigval_int = -860430388,
              sigval_ptr = 0x326493c1ccb6dfcc}, _reason = {_fault = {
                _trapno = 3}, _timer = {_timerid = 3, _overrun = 0}, _mesgq = {
                _mqd = 3}, _poll = {_band = 3}, _capsicum = {_syscall = 3},
              __spare__ = {__spare1__ = 3, __spare2__ = {106984784, -2048,
                  -1973194752, -512, -2126868952, -1, 106983424}}}},
          ksi_flags = -2130704888, ksi_sigq = 0x7}
#29 <signal handler called>
No locals.
#30 0x000000000028bb1a in ?? ()



-- 
Cheers,
Cy Schubert <cy.schub...@cschubert.com>
FreeBSD UNIX:  <c...@freebsd.org>   Web:  https://FreeBSD.org
NTP:           <c...@nwtime.org>    Web:  https://nwtime.org

                        e**(i*pi)+1=0


Reply via email to