diff options
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/arch/amd64/cpu/mmu.c | 98 | ||||
| -rw-r--r-- | sys/inc/arch/amd64/vas.h | 39 | ||||
| -rw-r--r-- | sys/inc/mu/mmu.h | 54 | ||||
| -rw-r--r-- | sys/inc/vm/vm.h | 6 | ||||
| -rw-r--r-- | sys/kern/Makefile | 3 | ||||
| -rw-r--r-- | sys/kern/kern_init.c | 2 | ||||
| -rw-r--r-- | sys/mu/mmu_stub.c | 49 | ||||
| -rw-r--r-- | sys/vm/vm_init.c | 43 |
8 files changed, 293 insertions, 1 deletions
diff --git a/sys/arch/amd64/cpu/mmu.c b/sys/arch/amd64/cpu/mmu.c new file mode 100644 index 0000000..65c4e46 --- /dev/null +++ b/sys/arch/amd64/cpu/mmu.c @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2023-2025 Ian Marco Moffett and the Osmora Team. + * 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 Hyra 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 <kern/panic.h> +#include <mu/mmu.h> +#include <vm/vm.h> +#include <md/vas.h> + +/* + * See Intel SDM Vol 3A, Section 4.5, Table 4-19 + */ +#define PTE_ADDR_MASK 0x000FFFFFFFFFF000 +#define PTE_P BIT(0) /* Present */ +#define PTE_RW BIT(1) /* Writable */ +#define PTE_US BIT(2) /* User r/w allowed */ +#define PTE_PWT BIT(3) /* Page-level write-through */ +#define PTE_PCD BIT(4) /* Page-level cache disable */ +#define PTE_ACC BIT(5) /* Accessed */ +#define PTE_DIRTY BIT(6) /* Dirty (written-to page) */ +#define PTE_PS BIT(7) /* Page size */ +#define PTE_GLOBAL BIT(8) /* Global / sticky map */ +#define PTE_NX BIT(63) /* Execute-disable */ + +int +mu_pmap_readvas(struct mmu_vas *vas) +{ + __asmv( + "mov %%cr3, %0" + : "=r" (vas->cr3) + : + : "memory" + ); + + vas->cr3 &= PTE_ADDR_MASK; + return 0; +} + +int +mu_pmap_writevas(struct mmu_vas *vas) +{ + __asmv( + "mov %0, %%cr3" + : + : "r" (vas->cr3) + : "memory" + ); + + return 0; +} + +void +mu_pmap_init(void) +{ + struct mmu_vas cur_vas; + uintptr_t *pml4; + + /* Tear down the old lower half mappings */ + mu_pmap_readvas(&cur_vas); + pml4 = PHYS_TO_VIRT(cur_vas.cr3); + for (uint16_t i = 0; i < 256; ++i) { + pml4[i] = 0; + } + + /* + * The entries in the TLB may still refer to the old lower + * half mappings which are now stale... To avoid this biting + * us in the ass we should flush the *entire* TLB + */ + mu_pmap_writevas(&cur_vas); +} diff --git a/sys/inc/arch/amd64/vas.h b/sys/inc/arch/amd64/vas.h new file mode 100644 index 0000000..eeca5f7 --- /dev/null +++ b/sys/inc/arch/amd64/vas.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2023-2025 Ian Marco Moffett and the Osmora Team. + * 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 Hyra 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 _MACHINE_VAS_H_ +#define _MACHINE_VAS_H_ 1 + +#include <sys/types.h> + +struct mmu_vas { + uintptr_t cr3; +}; + +#endif /* !_MACHINE_VAS_H_ */ diff --git a/sys/inc/mu/mmu.h b/sys/inc/mu/mmu.h new file mode 100644 index 0000000..85f4343 --- /dev/null +++ b/sys/inc/mu/mmu.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2023-2025 Ian Marco Moffett and the Osmora Team. + * 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 Hyra 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 _MU_PMAP_H_ +#define _MU_PMAP_H_ 1 + +#include <sys/types.h> +#include <sys/cdefs.h> +#include <md/vas.h> /* shared */ + +/* + * Read the currently in-use virtual address space + * structure + */ +__weak int mu_pmap_readvas(struct mmu_vas *vas); + +/* + * Write a new virtual address structure to be put + * into use as the current address space + */ +__weak int mu_pmap_writevas(struct mmu_vas *vas); + +/* + * Initialize the platform memory management unit + */ +__weak void mu_pmap_init(void); + +#endif /* !_MU_PMAP_H_ */ diff --git a/sys/inc/vm/vm.h b/sys/inc/vm/vm.h index e1866cb..4134005 100644 --- a/sys/inc/vm/vm.h +++ b/sys/inc/vm/vm.h @@ -40,4 +40,10 @@ extern volatile struct limine_hhdm_request hhdm_req; #define PHYS_TO_VIRT(PHYS) PTR_OFFSET(PHYS, hhdm_req.response->offset) #define VIRT_TO_PHYS(VIRT) (uintptr_t)PTR_NOFFET(VIRT, hhdm_req.response->offset) +/* + * Initialize the virtual memory management + * subsystem + */ +void vm_init(void); + #endif /* !_VM_VM_H_ */ diff --git a/sys/kern/Makefile b/sys/kern/Makefile index b04e252..718df06 100644 --- a/sys/kern/Makefile +++ b/sys/kern/Makefile @@ -6,6 +6,7 @@ CFILES += $(shell find ../lib -name "*.c") CFILES += $(shell find ../os -name "*.c") CFILES += $(shell find ../vm -name "*.c") CFILES += $(shell find ../dev -name "*.c") +CFILES += $(shell find ../mu -name "*.c") OFILES = $(CFILES:.c=.o) DFILES = $(CFILES:.c=.d) CC = @@ -17,4 +18,4 @@ all: $(OFILES) -include $(DFILES) %.o: %.c $(PROMPT) " [CC] " $< - $(CC) -c $< $(SYS_CFLAGS) -MMD -I../inc/ -I../inc/lib -o $@ + $(CC) -c $< $(SYS_CFLAGS) -MMD -I../target/inc/ -I../inc/ -I../inc/lib -o $@ diff --git a/sys/kern/kern_init.c b/sys/kern/kern_init.c index 74e17c4..68fb2fb 100644 --- a/sys/kern/kern_init.c +++ b/sys/kern/kern_init.c @@ -31,6 +31,7 @@ #include <dev/cons/cons.h> #include <os/trace.h> #include <vm/phys.h> +#include <vm/vm.h> struct console g_bootcons; void kmain(void); @@ -41,4 +42,5 @@ kmain(void) console_reset(&g_bootcons); trace("bootcons: console online\n"); vm_phys_init(); + vm_init(); } diff --git a/sys/mu/mmu_stub.c b/sys/mu/mmu_stub.c new file mode 100644 index 0000000..4c2a3fa --- /dev/null +++ b/sys/mu/mmu_stub.c @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2023-2025 Ian Marco Moffett and the Osmora Team. + * 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 Hyra 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/cdefs.h> +#include <mu/mmu.h> + +__strong void +mu_pmap_init(void) +{ + (void)0; +} + +__strong int +mu_pmap_readvas(struct mmu_vas *vas) +{ + (void)vas; +} + +__strong int +mu_pmap_writevas(struct mmu_vas *vas) +{ + (void)vas; +} diff --git a/sys/vm/vm_init.c b/sys/vm/vm_init.c new file mode 100644 index 0000000..8a08671 --- /dev/null +++ b/sys/vm/vm_init.c @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2025 Ian Marco Moffett and the Osmora Team. + * 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 Hyra 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 PURPKERNE + * 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; LKERNS 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 + * PKERNSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/types.h> +#include <os/trace.h> +#include <vm/vm.h> +#include <mu/mmu.h> + +#define dtrace(fmt, ...) trace("vm: " fmt, ##__VA_ARGS__) + +void +vm_init(void) +{ + dtrace("bringing up mmu...\n"); + mu_pmap_init(); + dtrace("OK\n"); +} |
