1*aead354dSthorpej /* $NetBSD: acpi_debug.c,v 1.8 2020/07/08 13:41:53 thorpej Exp $ */
24cd0ccf8Sjruoho
34cd0ccf8Sjruoho /*-
44cd0ccf8Sjruoho * Copyright (c) 2010 Jukka Ruohonen <jruohonen@iki.fi>
54cd0ccf8Sjruoho * All rights reserved.
64cd0ccf8Sjruoho *
74cd0ccf8Sjruoho * Redistribution and use in source and binary forms, with or without
84cd0ccf8Sjruoho * modification, are permitted provided that the following conditions
94cd0ccf8Sjruoho * are met:
104cd0ccf8Sjruoho *
114cd0ccf8Sjruoho * 1. Redistributions of source code must retain the above copyright
124cd0ccf8Sjruoho * notice, this list of conditions and the following disclaimer.
134cd0ccf8Sjruoho * 2. Redistributions in binary form must reproduce the above copyright
144cd0ccf8Sjruoho * notice, this list of conditions and the following disclaimer in the
154cd0ccf8Sjruoho * documentation and/or other materials provided with the distribution.
164cd0ccf8Sjruoho *
174cd0ccf8Sjruoho * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
184cd0ccf8Sjruoho * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
194cd0ccf8Sjruoho * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
204cd0ccf8Sjruoho * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
214cd0ccf8Sjruoho * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
224cd0ccf8Sjruoho * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
234cd0ccf8Sjruoho * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
244cd0ccf8Sjruoho * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
254cd0ccf8Sjruoho * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
264cd0ccf8Sjruoho * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
274cd0ccf8Sjruoho * SUCH DAMAGE.
284cd0ccf8Sjruoho */
294cd0ccf8Sjruoho #include <sys/cdefs.h>
30*aead354dSthorpej __KERNEL_RCSID(0, "$NetBSD: acpi_debug.c,v 1.8 2020/07/08 13:41:53 thorpej Exp $");
314cd0ccf8Sjruoho
324cd0ccf8Sjruoho #include <sys/param.h>
334cd0ccf8Sjruoho #include <sys/sysctl.h>
344cd0ccf8Sjruoho
354cd0ccf8Sjruoho #include <dev/acpi/acpireg.h>
364cd0ccf8Sjruoho #include <dev/acpi/acpivar.h>
374cd0ccf8Sjruoho
384cd0ccf8Sjruoho #include <prop/proplib.h>
394cd0ccf8Sjruoho
404cd0ccf8Sjruoho #ifdef ACPI_DEBUG
414cd0ccf8Sjruoho
424cd0ccf8Sjruoho #define _COMPONENT ACPI_UTILITIES
434cd0ccf8Sjruoho ACPI_MODULE_NAME ("acpi_debug")
444cd0ccf8Sjruoho
454cd0ccf8Sjruoho #define ACPI_DEBUG_MAX 64
464cd0ccf8Sjruoho #define ACPI_DEBUG_NONE 0
474cd0ccf8Sjruoho
484cd0ccf8Sjruoho #define ACPI_DEBUG_ADD(d, x) \
494cd0ccf8Sjruoho do { \
504cd0ccf8Sjruoho (void)prop_dictionary_set_uint32(d, #x, x); \
514cd0ccf8Sjruoho \
524cd0ccf8Sjruoho } while (/* CONSTCOND */ 0)
534cd0ccf8Sjruoho
544cd0ccf8Sjruoho
554cd0ccf8Sjruoho static prop_dictionary_t acpi_debug_layer_d;
564cd0ccf8Sjruoho static prop_dictionary_t acpi_debug_level_d;
574cd0ccf8Sjruoho static char acpi_debug_layer_s[ACPI_DEBUG_MAX];
584cd0ccf8Sjruoho static char acpi_debug_level_s[ACPI_DEBUG_MAX];
594cd0ccf8Sjruoho
604cd0ccf8Sjruoho static int acpi_debug_create(void);
614cd0ccf8Sjruoho static const char *acpi_debug_getkey(prop_dictionary_t, uint32_t);
624cd0ccf8Sjruoho static int acpi_debug_sysctl_layer(SYSCTLFN_PROTO);
634cd0ccf8Sjruoho static int acpi_debug_sysctl_level(SYSCTLFN_PROTO);
644cd0ccf8Sjruoho
654cd0ccf8Sjruoho void
acpi_debug_init(void)664cd0ccf8Sjruoho acpi_debug_init(void)
674cd0ccf8Sjruoho {
6842105e9fSjruoho const struct sysctlnode *rnode;
6942105e9fSjruoho const char *layer, *level;
704cd0ccf8Sjruoho int rv;
714cd0ccf8Sjruoho
724cd0ccf8Sjruoho KASSERT(acpi_debug_layer_d == NULL);
734cd0ccf8Sjruoho KASSERT(acpi_debug_level_d == NULL);
744cd0ccf8Sjruoho
754cd0ccf8Sjruoho rv = acpi_debug_create();
764cd0ccf8Sjruoho
774cd0ccf8Sjruoho if (rv != 0)
784cd0ccf8Sjruoho goto fail;
794cd0ccf8Sjruoho
8042105e9fSjruoho rv = sysctl_createv(NULL, 0, NULL, &rnode,
814cd0ccf8Sjruoho CTLFLAG_PERMANENT, CTLTYPE_NODE, "acpi",
8242105e9fSjruoho NULL, NULL, 0, NULL, 0,
834f6fb3bfSpooka CTL_HW, CTL_CREATE, CTL_EOL);
844cd0ccf8Sjruoho
854cd0ccf8Sjruoho if (rv != 0)
864cd0ccf8Sjruoho goto fail;
874cd0ccf8Sjruoho
8842105e9fSjruoho rv = sysctl_createv(NULL, 0, &rnode, &rnode,
8942105e9fSjruoho 0, CTLTYPE_NODE, "debug",
9042105e9fSjruoho SYSCTL_DESCR("ACPI debug subtree"),
9142105e9fSjruoho NULL, 0, NULL, 0,
9242105e9fSjruoho CTL_CREATE, CTL_EOL);
9342105e9fSjruoho
9442105e9fSjruoho if (rv != 0)
9542105e9fSjruoho goto fail;
9642105e9fSjruoho
9742105e9fSjruoho rv = sysctl_createv(NULL, 0, &rnode, NULL,
9842105e9fSjruoho CTLFLAG_READWRITE, CTLTYPE_STRING, "layer",
994cd0ccf8Sjruoho SYSCTL_DESCR("ACPI debug layer"),
1004cd0ccf8Sjruoho acpi_debug_sysctl_layer, 0, acpi_debug_layer_s, ACPI_DEBUG_MAX,
10142105e9fSjruoho CTL_CREATE, CTL_EOL);
1024cd0ccf8Sjruoho
1034cd0ccf8Sjruoho if (rv != 0)
1044cd0ccf8Sjruoho goto fail;
1054cd0ccf8Sjruoho
10642105e9fSjruoho rv = sysctl_createv(NULL, 0, &rnode, NULL,
10742105e9fSjruoho CTLFLAG_READWRITE, CTLTYPE_STRING, "level",
1084cd0ccf8Sjruoho SYSCTL_DESCR("ACPI debug level"),
1094cd0ccf8Sjruoho acpi_debug_sysctl_level, 0, acpi_debug_level_s, ACPI_DEBUG_MAX,
11042105e9fSjruoho CTL_CREATE, CTL_EOL);
1114cd0ccf8Sjruoho
1124cd0ccf8Sjruoho if (rv != 0)
1134cd0ccf8Sjruoho goto fail;
1144cd0ccf8Sjruoho
115951577ebSjruoho rv = sysctl_createv(NULL, 0, &rnode, NULL,
116951577ebSjruoho CTLFLAG_READWRITE, CTLTYPE_BOOL, "object",
117951577ebSjruoho SYSCTL_DESCR("ACPI debug object"),
118951577ebSjruoho NULL, 0, &AcpiGbl_EnableAmlDebugObject, 0,
119951577ebSjruoho CTL_CREATE, CTL_EOL);
120951577ebSjruoho
121951577ebSjruoho if (rv != 0)
122951577ebSjruoho goto fail;
123951577ebSjruoho
1244cd0ccf8Sjruoho layer = acpi_debug_getkey(acpi_debug_layer_d, AcpiDbgLayer);
1254cd0ccf8Sjruoho level = acpi_debug_getkey(acpi_debug_level_d, AcpiDbgLevel);
1264cd0ccf8Sjruoho
12780e08fdbSchs strlcpy(acpi_debug_layer_s, layer, ACPI_DEBUG_MAX);
12880e08fdbSchs strlcpy(acpi_debug_level_s, level, ACPI_DEBUG_MAX);
1294cd0ccf8Sjruoho
1304cd0ccf8Sjruoho return;
1314cd0ccf8Sjruoho
1324cd0ccf8Sjruoho fail:
1334cd0ccf8Sjruoho aprint_error("acpi0: failed to initialize ACPI debug\n");
1344cd0ccf8Sjruoho }
1354cd0ccf8Sjruoho
1364cd0ccf8Sjruoho static int
acpi_debug_create(void)1374cd0ccf8Sjruoho acpi_debug_create(void)
1384cd0ccf8Sjruoho {
1394cd0ccf8Sjruoho
1404cd0ccf8Sjruoho acpi_debug_layer_d = prop_dictionary_create();
1414cd0ccf8Sjruoho acpi_debug_level_d = prop_dictionary_create();
1424cd0ccf8Sjruoho
1434cd0ccf8Sjruoho KASSERT(acpi_debug_layer_d != NULL);
1444cd0ccf8Sjruoho KASSERT(acpi_debug_level_d != NULL);
1454cd0ccf8Sjruoho
1464cd0ccf8Sjruoho /*
1474cd0ccf8Sjruoho * General components.
1484cd0ccf8Sjruoho */
1494cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_UTILITIES);
1504cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_HARDWARE);
1514cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_EVENTS);
1524cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_TABLES);
1534cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_NAMESPACE);
1544cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_PARSER);
1554cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_DISPATCHER);
1564cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_EXECUTER);
1574cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_RESOURCES);
1584cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_CA_DEBUGGER);
1594cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_OS_SERVICES);
1604cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_CA_DISASSEMBLER);
1614cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_COMPILER);
1624cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_TOOLS);
1634cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_EXAMPLE);
1644cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_DRIVER);
1654cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_ALL_COMPONENTS);
1664cd0ccf8Sjruoho
1674cd0ccf8Sjruoho /*
1684cd0ccf8Sjruoho * NetBSD specific components.
1694cd0ccf8Sjruoho */
1704cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_BUS_COMPONENT);
1714cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_ACAD_COMPONENT);
1724cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_BAT_COMPONENT);
1734cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_BUTTON_COMPONENT);
1744cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_EC_COMPONENT);
1754cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_LID_COMPONENT);
1764cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_RESOURCE_COMPONENT);
1774cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_TZ_COMPONENT);
178f32ca0cfSgsutre ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_DISPLAY_COMPONENT);
1794cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_ALL_DRIVERS);
1804cd0ccf8Sjruoho
1814cd0ccf8Sjruoho /*
1824cd0ccf8Sjruoho * Debug levels.
1834cd0ccf8Sjruoho */
1844cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_INIT);
1854cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_DEBUG_OBJECT);
1864cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_INFO);
1874cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_ALL_EXCEPTIONS);
1884cd0ccf8Sjruoho
1894cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_INIT_NAMES);
1904cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_PARSE);
1914cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_LOAD);
1924cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_DISPATCH);
1934cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_EXEC);
1944cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_NAMES);
1954cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_OPREGION);
1964cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_BFIELD);
1974cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_TABLES);
1984cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_VALUES);
1994cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_OBJECTS);
2004cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_RESOURCES);
2014cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_USER_REQUESTS);
2024cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_PACKAGE);
2034cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_VERBOSITY1);
2044cd0ccf8Sjruoho
2054cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_ALLOCATIONS);
2064cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_FUNCTIONS);
2074cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_OPTIMIZATIONS);
2084cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_VERBOSITY2);
2094cd0ccf8Sjruoho
2104cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_MUTEX);
2114cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_THREADS);
2124cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_IO);
2134cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_INTERRUPTS);
2144cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_VERBOSITY3);
2154cd0ccf8Sjruoho
2164cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_AML_DISASSEMBLE);
2174cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_VERBOSE_INFO);
2184cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_FULL_TABLES);
2194cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_EVENTS);
2204cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_VERBOSE);
2214cd0ccf8Sjruoho
22269d7b046Schristos ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_NORMAL_DEFAULT);
22369d7b046Schristos
2244cd0ccf8Sjruoho /*
2254cd0ccf8Sjruoho * The default debug level.
2264cd0ccf8Sjruoho */
2274cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_DEBUG_DEFAULT);
2284cd0ccf8Sjruoho
2294cd0ccf8Sjruoho /*
2304cd0ccf8Sjruoho * A custom ACPI_DEBUG_NONE disables debugging.
2314cd0ccf8Sjruoho */
2324cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_DEBUG_NONE);
2334cd0ccf8Sjruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_DEBUG_NONE);
2344cd0ccf8Sjruoho
2354cd0ccf8Sjruoho prop_dictionary_make_immutable(acpi_debug_layer_d);
2364cd0ccf8Sjruoho prop_dictionary_make_immutable(acpi_debug_level_d);
2374cd0ccf8Sjruoho
2384cd0ccf8Sjruoho return 0;
2394cd0ccf8Sjruoho }
2404cd0ccf8Sjruoho
2414cd0ccf8Sjruoho static const char *
acpi_debug_getkey(prop_dictionary_t dict,uint32_t arg)2424cd0ccf8Sjruoho acpi_debug_getkey(prop_dictionary_t dict, uint32_t arg)
2434cd0ccf8Sjruoho {
2444cd0ccf8Sjruoho prop_object_iterator_t i;
2454cd0ccf8Sjruoho prop_object_t obj, val;
2464cd0ccf8Sjruoho const char *key;
2474cd0ccf8Sjruoho uint32_t num;
2484cd0ccf8Sjruoho
2494cd0ccf8Sjruoho i = prop_dictionary_iterator(dict);
2504cd0ccf8Sjruoho
2514cd0ccf8Sjruoho while ((obj = prop_object_iterator_next(i)) != NULL) {
2524cd0ccf8Sjruoho
253*aead354dSthorpej key = prop_dictionary_keysym_value(obj);
2544cd0ccf8Sjruoho val = prop_dictionary_get(dict, key);
255*aead354dSthorpej num = prop_number_unsigned_value(val);
2564cd0ccf8Sjruoho
2574cd0ccf8Sjruoho if (arg == num)
2584cd0ccf8Sjruoho return key;
2594cd0ccf8Sjruoho }
2604cd0ccf8Sjruoho
2614cd0ccf8Sjruoho return "UNKNOWN";
2624cd0ccf8Sjruoho }
2634cd0ccf8Sjruoho
2644cd0ccf8Sjruoho static int
acpi_debug_sysctl_layer(SYSCTLFN_ARGS)2654cd0ccf8Sjruoho acpi_debug_sysctl_layer(SYSCTLFN_ARGS)
2664cd0ccf8Sjruoho {
2674cd0ccf8Sjruoho char buf[ACPI_DEBUG_MAX];
2684cd0ccf8Sjruoho struct sysctlnode node;
2694cd0ccf8Sjruoho prop_object_t obj;
2704cd0ccf8Sjruoho int error;
2714cd0ccf8Sjruoho
2724cd0ccf8Sjruoho node = *rnode;
2734cd0ccf8Sjruoho node.sysctl_data = buf;
2744cd0ccf8Sjruoho
2754cd0ccf8Sjruoho (void)memcpy(node.sysctl_data, rnode->sysctl_data, ACPI_DEBUG_MAX);
2764cd0ccf8Sjruoho
2774cd0ccf8Sjruoho error = sysctl_lookup(SYSCTLFN_CALL(&node));
2784cd0ccf8Sjruoho
2794cd0ccf8Sjruoho if (error || newp == NULL)
2804cd0ccf8Sjruoho return error;
2814cd0ccf8Sjruoho
2824cd0ccf8Sjruoho obj = prop_dictionary_get(acpi_debug_layer_d, node.sysctl_data);
2834cd0ccf8Sjruoho
2844cd0ccf8Sjruoho if (obj == NULL)
2854cd0ccf8Sjruoho return EINVAL;
2864cd0ccf8Sjruoho
287*aead354dSthorpej AcpiDbgLayer = prop_number_unsigned_value(obj);
2884cd0ccf8Sjruoho
2894cd0ccf8Sjruoho (void)memcpy(rnode->sysctl_data, node.sysctl_data, ACPI_DEBUG_MAX);
2904cd0ccf8Sjruoho
2914cd0ccf8Sjruoho return 0;
2924cd0ccf8Sjruoho }
2934cd0ccf8Sjruoho
2944cd0ccf8Sjruoho static int
acpi_debug_sysctl_level(SYSCTLFN_ARGS)2954cd0ccf8Sjruoho acpi_debug_sysctl_level(SYSCTLFN_ARGS)
2964cd0ccf8Sjruoho {
2974cd0ccf8Sjruoho char buf[ACPI_DEBUG_MAX];
2984cd0ccf8Sjruoho struct sysctlnode node;
2994cd0ccf8Sjruoho prop_object_t obj;
3004cd0ccf8Sjruoho int error;
3014cd0ccf8Sjruoho
3024cd0ccf8Sjruoho node = *rnode;
3034cd0ccf8Sjruoho node.sysctl_data = buf;
3044cd0ccf8Sjruoho
3054cd0ccf8Sjruoho (void)memcpy(node.sysctl_data, rnode->sysctl_data, ACPI_DEBUG_MAX);
3064cd0ccf8Sjruoho
3074cd0ccf8Sjruoho error = sysctl_lookup(SYSCTLFN_CALL(&node));
3084cd0ccf8Sjruoho
3094cd0ccf8Sjruoho if (error || newp == NULL)
3104cd0ccf8Sjruoho return error;
3114cd0ccf8Sjruoho
3124cd0ccf8Sjruoho obj = prop_dictionary_get(acpi_debug_level_d, node.sysctl_data);
3134cd0ccf8Sjruoho
3144cd0ccf8Sjruoho if (obj == NULL)
3154cd0ccf8Sjruoho return EINVAL;
3164cd0ccf8Sjruoho
317*aead354dSthorpej AcpiDbgLevel = prop_number_unsigned_value(obj);
3184cd0ccf8Sjruoho
3194cd0ccf8Sjruoho (void)memcpy(rnode->sysctl_data, node.sysctl_data, ACPI_DEBUG_MAX);
3204cd0ccf8Sjruoho
3214cd0ccf8Sjruoho return 0;
3224cd0ccf8Sjruoho }
3234cd0ccf8Sjruoho
3244cd0ccf8Sjruoho #endif /* ACPI_DEBUG */
325