diff --git a/process.c b/process.c new file mode 100644 index 0000000000000000000000000000000000000000..60ff9e79feb9a88ae4047b6ee568b04938662414 --- /dev/null +++ b/process.c @@ -0,0 +1,40 @@ +#include <stdlib.h> +#include <stdio.h> +#include "hardware.h" +#include "process.h" + +int current_process = NULL; + +int ppage_of_vpage(int process, unsigned vpage) +{ + if (vpage < N) + { + if (process == PROCESS_0) + return 2 * vpage + 2; + if (process == PROCESS_1) + return 2 * vpage + 1; + } + + return -1; +} + +void mmu_handler() +{ + tlb_entry_t tlb; + unsigned int vaddr = ((long int)_in(MMU_FAULT_ADDR_HI) << 32) | (_in(MMU_FAULT_ADDR_LO) & 0xFFFFFFFF); + unsigned int vpage = (vaddr >> 12) & 0xFFF; + unsigned int ppage = ppage_of_vpage(current_process, vpage); + + if (vaddr < virtual_memory || vaddr > virtual_memory + VM_SIZE || vpage == -1) + { + fprintf(stderr, "Echec"); + exit(EXIT_FAILURE); + } + + tlb.s.tlb_vpage = vpage; + tlb.s.tlb_ppage = ppage; + tlb.s.tlb_rwx = 7; + tlb.s.tlb_used = 1; + + _out(TLB_ADD_ENTRY, tlb.i); +} diff --git a/process.h b/process.h new file mode 100644 index 0000000000000000000000000000000000000000..ea0b40b301048d594cdfe10fdcb48bbf5dd1afe7 --- /dev/null +++ b/process.h @@ -0,0 +1,34 @@ +#if !defined(PROCESS) +#define PROCESS + +#define PROCESS_1 1 +#define PROCESS_0 0 +#define N 127 +#define VM_SIZE 160000 * 8 + +#define MMU_FAULT_ADDR_LO 0xCC +#define MMU_FAULT_ADDR_HI 0xCD +#define TLB_ADD_ENTRY 0xCE + +struct tlb_entry_s +{ + unsigned tlb_RFU : 8; + unsigned tlb_vpage : 12; + unsigned tlb_ppage : 8; + unsigned tlb_rwx : 3; + unsigned tlb_used : 1; +}; + +union tlb_entry_u +{ + int i; + struct tlb_entry_s s; +}; + +typedef union tlb_entry_u tlb_entry_t; + +int ppage_of_vpage(int process, unsigned vpage); + +void mmu_handler(); + +#endif // PROCESS