diff --git a/sys/arm64/arm64/sys_machdep.c b/sys/arm64/arm64/sys_machdep.c --- a/sys/arm64/arm64/sys_machdep.c +++ b/sys/arm64/arm64/sys_machdep.c @@ -28,14 +28,37 @@ */ #include +#include #include #include +#include #include +#include + int sysarch(struct thread *td, struct sysarch_args *uap) { + struct pcb *pcb; + unsigned long sve_len; + int error; + + pcb = td->td_pcb; + + error = EINVAL; + AUDIT_ARG_CMD(uap->op); + switch (uap->op) { + case ARM64_GET_SVE_VL: + /* TODO: Check for SVE support */ + sve_len = pcb->pcb_sve_len; + if (sve_len != 0) + error = copyout(&sve_len, uap->parms, sizeof(sve_len)); + break; + default: + error = EINVAL; + break; + } - return (ENOTSUP); + return (error); } diff --git a/sys/arm64/include/sysarch.h b/sys/arm64/include/sysarch.h --- a/sys/arm64/include/sysarch.h +++ b/sys/arm64/include/sysarch.h @@ -39,6 +39,9 @@ #ifndef _MACHINE_SYSARCH_H_ #define _MACHINE_SYSARCH_H_ +#define ARM64_GET_SVE_VL 0x200 +/* Reserved ARM64_SET_SVE_VL 0x201 */ + #ifndef _KERNEL __BEGIN_DECLS