From 65358e670588910c0bb756ef4fecca3e9918e8b7 Mon Sep 17 00:00:00 2001 From: Matheus Date: Thu, 13 Aug 2026 00:43:15 -0300 Subject: [PATCH] sysctl: SYS_CTL_HW_CPUS_ONLINE --- kernel-src/include/kernel/sysctl.h | 3 ++ kernel-src/sys/ctl/hw.c | 44 ++++++++++++++++++++++++++++++ kernel-src/sys/ctl/sysctl.c | 2 ++ 3 files changed, 49 insertions(+) create mode 100644 kernel-src/sys/ctl/hw.c diff --git a/kernel-src/include/kernel/sysctl.h b/kernel-src/include/kernel/sysctl.h index 0046a97c..87c12df4 100644 --- a/kernel-src/include/kernel/sysctl.h +++ b/kernel-src/include/kernel/sysctl.h @@ -7,9 +7,11 @@ #define SYS_CTL_NAME_MAX 6 #define SYS_CTL_KERN 1 +#define SYS_CTL_HW 2 #define SYS_CTL_KERN_PROC 1 #define SYS_CTL_KERN_PROC_ALL 1 #define SYS_CTL_KERN_CONSOLE_LOCK 2 +#define SYS_CTL_HW_CPUS_ONLINE 1 #define SYS_CTL_KERN_PROC_INFO_NAME_SIZE 64 #define SYS_CTL_KERN_PROC_INFO_TTY_NAME_SIZE 64 @@ -39,5 +41,6 @@ typedef struct { int sysctl(const int *name, size_t name_len, void *oldp, size_t *old_lenp, void *newp, size_t new_len); int sysctl_kern(const int *name, size_t name_len, void *oldp, size_t *old_lenp, void *newp, size_t new_len); +int sysctl_hw(const int *name, size_t name_len, void *oldp, size_t *old_lenp, void *newp, size_t new_len); #endif diff --git a/kernel-src/sys/ctl/hw.c b/kernel-src/sys/ctl/hw.c new file mode 100644 index 00000000..ae8ed8b5 --- /dev/null +++ b/kernel-src/sys/ctl/hw.c @@ -0,0 +1,44 @@ +#include +#include +#include + +static int ctl_cpus_online(const int *, size_t name_len, void *oldp, size_t *old_lenp, void *newp, size_t) { + if (name_len != 0) + return EINVAL; + + if (newp) + return EPERM; + + if (!old_lenp) + return EINVAL; + + size_t old_len = 0; + if (oldp) { + int error = USERCOPY_POSSIBLY_FROM_USER(&old_len, old_lenp, sizeof(old_len)); + if (error) + return error; + } + + size_t required_len = sizeof(size_t); + int error = USERCOPY_POSSIBLY_TO_USER(old_lenp, &required_len, sizeof(required_len)); + if (error) + return error; + + if (!oldp) + return 0; + + if (old_len < required_len) + return ENOMEM; + + size_t cpus_online = arch_smp_get_cpu_count(); + return USERCOPY_POSSIBLY_TO_USER(oldp, &cpus_online, sizeof(cpus_online)); +} + +int sysctl_hw(const int *name, size_t name_len, void *oldp, size_t *old_lenp, void *newp, size_t new_len) { + switch (*name) { + case SYS_CTL_HW_CPUS_ONLINE: + return ctl_cpus_online(name + 1, name_len - 1, oldp, old_lenp, newp, new_len); + } + + return EINVAL; +} diff --git a/kernel-src/sys/ctl/sysctl.c b/kernel-src/sys/ctl/sysctl.c index a946264f..90ce4158 100644 --- a/kernel-src/sys/ctl/sysctl.c +++ b/kernel-src/sys/ctl/sysctl.c @@ -9,6 +9,8 @@ int sysctl(const int *name, size_t name_len, void *oldp, size_t *old_lenp, void switch (*name) { case SYS_CTL_KERN: return sysctl_kern(name + 1, name_len - 1, oldp, old_lenp, newp, new_len); + case SYS_CTL_HW: + return sysctl_hw(name + 1, name_len - 1, oldp, old_lenp, newp, new_len); default: return EINVAL; }