diff options
Diffstat (limited to 'src/sys')
-rw-r--r-- | src/sys/arch/amd64/cpu/cpu_conf.c | 3 | ||||
-rw-r--r-- | src/sys/arch/amd64/os/os_panic.c | 6 | ||||
-rw-r--r-- | src/sys/arch/amd64/simd.S | 75 | ||||
-rw-r--r-- | src/sys/include/compat/unix/syscall.h | 6 | ||||
-rw-r--r-- | src/sys/include/os/ucred.h | 61 | ||||
-rw-r--r-- | src/sys/include/sys/mman.h | 5 | ||||
-rw-r--r-- | src/sys/include/sys/proc.h | 2 | ||||
-rw-r--r-- | src/sys/include/sys/syscall.h | 2 | ||||
-rw-r--r-- | src/sys/include/sys/ucred.h | 48 | ||||
-rw-r--r-- | src/sys/include/vm/map.h | 6 | ||||
-rw-r--r-- | src/sys/os/os_proc.c | 8 | ||||
-rw-r--r-- | src/sys/os/os_ucred.c | 90 | ||||
-rw-r--r-- | src/sys/vm/vm_map.c | 61 |
13 files changed, 368 insertions, 5 deletions
diff --git a/src/sys/arch/amd64/cpu/cpu_conf.c b/src/sys/arch/amd64/cpu/cpu_conf.c index da2d747..8a3b4e6 100644 --- a/src/sys/arch/amd64/cpu/cpu_conf.c +++ b/src/sys/arch/amd64/cpu/cpu_conf.c @@ -44,7 +44,9 @@ extern void syscall_isr(void); extern void core_halt_isr(void); + void core_halt_handler(void); +int simd_init(void); void core_halt_handler(void) @@ -193,6 +195,7 @@ cpu_conf(struct pcore *pcore) pcore->self = pcore; wrmsr(IA32_GS_BASE, (uintptr_t)pcore); + simd_init(); init_vectors(); idt_load(); cpu_identify(mdcore); diff --git a/src/sys/arch/amd64/os/os_panic.c b/src/sys/arch/amd64/os/os_panic.c index 88e962e..996ba13 100644 --- a/src/sys/arch/amd64/os/os_panic.c +++ b/src/sys/arch/amd64/os/os_panic.c @@ -37,12 +37,16 @@ __dead void panic(const char *fmt, ...) { static va_list ap; + struct pcore *core = this_core(); + uint32_t core_id; cpu_halt_others(); va_start(ap, fmt); - printf("lunos panic: "); + core_id = (core == NULL) ? 0xFF : core->id; + printf("lunos panic[cpu %d]: ", core_id); vprintf(fmt, &ap); + for (;;) { md_intoff(); md_halt(); diff --git a/src/sys/arch/amd64/simd.S b/src/sys/arch/amd64/simd.S new file mode 100644 index 0000000..f0673f9 --- /dev/null +++ b/src/sys/arch/amd64/simd.S @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2025 Ian Marco Moffett and L5 engineers + * All rights reserved. + * + * 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. + * 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. + * 3. Neither the name of the project nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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. + */ + .text + .globl simd_init +simd_init: + /* + * Enable SIMD, if SSE and AVX is supported, + * a value of zero is returned. If SSE is + * supported yet AVX is not, a value of one + * is returned. However, if none are supported, + * this routine returns -1. + */ + + // Do we support SSE? + mov $1, %eax + cpuid + bt $25, %edx + jnc .sse_not_sup + + mov %cr0, %rax // Old CR0 -> EAX + and $0xFFFB, %ax // Disable co-processor emulation + or $0x02, %ax // Enable co-processor monitoring + mov %rax, %cr0 // Update CR0 with new flags + + mov %cr4, %rax // Old CR4 -> EAX + or $0x200, %ax // Enable FXSAVE/FXRSTOR + or $0x400, %ax // Enable SIMD FP exceptions + mov %rax, %cr4 // Update CR4 with new flags + + mov $1, %eax // LEAF 1 + cpuid // Bit 28 of ECX indicates AVX support + mov $3, %eax // We need to check two bits + shl $27, %eax // Which are ECX.OSXSAVE and ECX.AVX + test %eax, %ecx // Are XSAVE and AVX supported? + jnc .avx_not_sup // Nope, just continue + + // Enable AVX + xor %rcx, %rcx // Select XCR0 + xgetbv // Load extended control register + or $0x07, %eax // Set AVX + SSE bits + xsetbv // Store new flags + xor %rax, %rax // Everything is good + retq // Return back to caller (RETURN) +.sse_not_sup: + mov $-1, %rax + retq +.avx_not_sup: + mov $1, %rax + retq diff --git a/src/sys/include/compat/unix/syscall.h b/src/sys/include/compat/unix/syscall.h index 38419af..5df3c51 100644 --- a/src/sys/include/compat/unix/syscall.h +++ b/src/sys/include/compat/unix/syscall.h @@ -35,9 +35,11 @@ #include <sys/param.h> #include <sys/mount.h> #include <sys/syscall.h> +#include <os/ucred.h> #include <os/iotap.h> #include <os/reboot.h> #include <dms/dms.h> +#include <vm/map.h> /* * Exit the current process - exit(2) syscall @@ -98,7 +100,9 @@ scret_t(*g_unix_sctab[])(struct syscall_args *) = { [SYS_close] = sys_close, [SYS_lseek] = sys_lseek, [SYS_socket] = sys_socket, - [SYS_listen] = sys_listen + [SYS_listen] = sys_listen, + [SYS_seteuid] = sys_seteuid, + [SYS_mmap] = sys_mmap }; #endif /* !_NEED_UNIX_SCTAB */ diff --git a/src/sys/include/os/ucred.h b/src/sys/include/os/ucred.h new file mode 100644 index 0000000..6e3e4b4 --- /dev/null +++ b/src/sys/include/os/ucred.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2025 Ian Marco Moffett and L5 engineers + * All rights reserved. + * + * 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. + * 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. + * 3. Neither the name of the project nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 _OS_UCRED_H_ +#define _OS_UCRED_H_ 1 + +#include <sys/syscall.h> +#include <sys/types.h> +#include <sys/ucred.h> +#include <sys/proc.h> + +/* + * Initialize user credientials + * + * @proc: Current process + * @cred: credientials to initialize + * + * XXX: 'proc' being NULL drops the creds to root + * + * Returns zero on success, otherwise a less + * than zero value on failure. + */ +int ucred_init(struct proc *proc, struct ucred *cred); + +/* + * Set effective user ID + */ +int seteuid(uid_t euid); + +/* + * Set EUID system call + */ +scret_t sys_seteuid(struct syscall_args *scargs); + +#endif /* !_OS_UCRED_H_ */ diff --git a/src/sys/include/sys/mman.h b/src/sys/include/sys/mman.h index 7ae1ed2..b688fdd 100644 --- a/src/sys/include/sys/mman.h +++ b/src/sys/include/sys/mman.h @@ -39,4 +39,9 @@ #define PROT_USER BIT(3) #endif /* _KERNEL */ +/* + * Map memory pages + */ +void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off); + #endif /* !_SYS_MMAN_H_ */ diff --git a/src/sys/include/sys/proc.h b/src/sys/include/sys/proc.h index a547233..b188d50 100644 --- a/src/sys/include/sys/proc.h +++ b/src/sys/include/sys/proc.h @@ -30,6 +30,7 @@ #ifndef _SYS_PROC_H_ #define _SYS_PROC_H_ +#include <sys/ucred.h> #include <sys/types.h> #include <sys/syscall.h> #include <sys/cdefs.h> @@ -91,6 +92,7 @@ struct proc { struct penv_blk *envblk; struct ptrbox *envblk_box; struct proc *parent; + struct ucred cred; mac_level_t level; struct spinlock maplist_lock; sigtab_t sigtab; diff --git a/src/sys/include/sys/syscall.h b/src/sys/include/sys/syscall.h index 2ca712f..ee6ef48 100644 --- a/src/sys/include/sys/syscall.h +++ b/src/sys/include/sys/syscall.h @@ -61,6 +61,8 @@ #define SYS_lseek 0x10 /* seek to end of file */ #define SYS_socket 0x11 /* get a socket fd */ #define SYS_listen 0x12 /* listen on a socket */ +#define SYS_seteuid 0x13 /* set effective UID */ +#define SYS_mmap 0x14 /* map a virtual address */ typedef __ssize_t scret_t; typedef __ssize_t scarg_t; diff --git a/src/sys/include/sys/ucred.h b/src/sys/include/sys/ucred.h new file mode 100644 index 0000000..ab44b6c --- /dev/null +++ b/src/sys/include/sys/ucred.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2025 Ian Marco Moffett and L5 engineers + * All rights reserved. + * + * 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. + * 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. + * 3. Neither the name of the project nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 _SYS_UCRED_H_ +#define _SYS_UCRED_H_ 1 + +#include <sys/types.h> + +/* + * Represents current user credientials + * + * @euid: Effective user ID + * @ruid: Real user ID + * @suid: Saved UID + */ +struct ucred { + uid_t euid; + uid_t ruid; + uid_t suid; +}; + +#endif /* !_SYS_UCRED_H_ */ diff --git a/src/sys/include/vm/map.h b/src/sys/include/vm/map.h index 69d7d73..8183b62 100644 --- a/src/sys/include/vm/map.h +++ b/src/sys/include/vm/map.h @@ -31,6 +31,7 @@ #define _VM_MAP_H_ 1 #include <sys/types.h> +#include <sys/syscall.h> #include <sys/mman.h> #include <machine/vas.h> /* standard */ #include <vm/mmu.h> @@ -52,4 +53,9 @@ */ int vm_map(struct vm_vas *vas, struct mmu_map *spec, size_t len, int prot); +/* + * POSIX mmap syscall + */ +scret_t sys_mmap(struct syscall_args *scargs); + #endif /* !_VM_MAP_H_ */ diff --git a/src/sys/os/os_proc.c b/src/sys/os/os_proc.c index a8f49d7..ef6c04c 100644 --- a/src/sys/os/os_proc.c +++ b/src/sys/os/os_proc.c @@ -40,6 +40,7 @@ #include <os/systm.h> #include <vm/vm.h> #include <vm/physseg.h> +#include <os/ucred.h> #include <os/elfload.h> #include <os/signal.h> #include <os/kalloc.h> @@ -386,9 +387,14 @@ proc_spawn(const char *path, struct penv_blk *envbp) proc->envblk = envbp; proc->parent = proc_self(); + error = ucred_init(proc->parent, &proc->cred); + if (error < 0) { + kfree(proc); + return error; + } + md_set_ip(proc, elf.entrypoint); sched_enq(&core->scq, proc); - TAILQ_INSERT_TAIL(&procq, proc, lup_link); return proc->pid; } diff --git a/src/sys/os/os_ucred.c b/src/sys/os/os_ucred.c new file mode 100644 index 0000000..bf46308 --- /dev/null +++ b/src/sys/os/os_ucred.c @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2025 Ian Marco Moffett and L5 engineers + * All rights reserved. + * + * 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. + * 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. + * 3. Neither the name of the project nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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. + */ + +#include <sys/types.h> +#include <sys/cdefs.h> +#include <sys/errno.h> +#include <os/ucred.h> +#include <os/ucred.h> + +int +ucred_init(struct proc *proc, struct ucred *cred) +{ + struct ucred *curcred; + + if (cred == NULL) { + return -EINVAL; + } + + if (proc != NULL) { + curcred = &proc->cred; + cred->ruid = curcred->ruid; + } else { + cred->ruid = 0; + } + + cred->euid = cred->ruid; + cred->suid = cred->ruid; + return 0; +} + +int +seteuid(uid_t euid) +{ + struct proc *self = proc_self(); + struct ucred *cred; + int retval = -EPERM; + + if (__unlikely(self == NULL)) { + return -ESRCH; + } + + /* Verify against current creds */ + cred = &self->cred; + if (euid == cred->euid || euid == cred->ruid) { + cred->euid = euid; + retval = 0; + } else if (euid == cred->suid || cred->euid == 0) { + cred->euid = euid; + retval = 0; + } + + return retval; +} + +/* + * ARG0: EUID + */ +scret_t +sys_seteuid(struct syscall_args *scargs) +{ + uid_t euid = SCARG(scargs, int, 0); + + return seteuid(euid); +} diff --git a/src/sys/vm/vm_map.c b/src/sys/vm/vm_map.c index 6748348..1d801af 100644 --- a/src/sys/vm/vm_map.c +++ b/src/sys/vm/vm_map.c @@ -30,12 +30,16 @@ #include <sys/types.h> #include <sys/param.h> #include <sys/errno.h> +#include <sys/param.h> #include <sys/syslog.h> #include <vm/physseg.h> #include <vm/mmu.h> #include <vm/map.h> #include <vm/vm.h> +#define MMAP_START 0x6F3C8E0C0000 +#define MMAP_END 0x6F3C90000000 + /* * Create a virtual to physical memory * mapping @@ -133,7 +137,60 @@ vm_map(struct vm_vas *vas, struct mmu_map *spec, size_t len, int prot) } /* Place a guard page at the end */ - spec->va = spec_cpy.va + len; - __vm_map(vas, spec, DEFAULT_PAGESIZE, 0); + spec_cpy.va = spec_cpy.va + len; + __vm_map(vas, &spec_cpy, DEFAULT_PAGESIZE, 0); return 0; } + +void * +mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off) +{ + struct mmu_map spec; + struct vm_vas vas; + paddr_t pa; + int error; + + /* TODO: Support address allocation */ + if (len == 0 || addr == NULL) { + return NULL; + } + + spec.va = (uintptr_t)addr; + spec.pa = 0; + error = mmu_this_vas(&vas); + if (error < 0) { + return NULL; + } + + /* Create the mapping */ + error = vm_map(&vas, &spec, len, prot); + if (error < 0) { + return NULL; + } + + return (void *)spec.va; +} + +/* + * ARG0: Address + * ARG1: Length + * ARG2: Protection flags + * ARG3: Flags + * ARG4: Fildes + * ARG5: Offset + */ +scret_t +sys_mmap(struct syscall_args *scargs) +{ + void *address = SCARG(scargs, void *, 0); + size_t length = SCARG(scargs, size_t, 1); + int prot = SCARG(scargs, int, 2); + + prot |= PROT_USER; + if (address != NULL) { + address = PTR_OFFSET(address, MMAP_START); + } + + /* XXX: Should use rest of the args */ + return (uintptr_t)mmap(address, length, prot, 0, 0, 0); +} |