From 3676254417137f8fa19241d530b1dbb98f65afa2 Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Sun, 12 Jan 2020 16:53:32 +0100 Subject: [PATCH] Header rationalization for mm/ dir --- include/mm/gdt.h | 115 ++++++++++++++++++++++++++++++++++++++++++++ include/mm/map.h | 85 ++++++++++++++++++++++++++++++++ include/mm/paging.h | 92 +++++++++++++++++++++++++++++++++++ 3 files changed, 292 insertions(+) create mode 100644 include/mm/gdt.h create mode 100644 include/mm/map.h create mode 100644 include/mm/paging.h diff --git a/include/mm/gdt.h b/include/mm/gdt.h new file mode 100644 index 0000000..289f911 --- /dev/null +++ b/include/mm/gdt.h @@ -0,0 +1,115 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Desc: GDT related functions // +// // +// // +// Copyright © 2018-2019 The OS/K Team // +// // +// This file is part of OS/K. // +// // +// OS/K is free software: you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation, either version 3 of the License, or // +// any later version. // +// // +// OS/K is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY//without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with OS/K. If not, see . // +//----------------------------------------------------------------------------// + +#ifndef _KERNEL_H +#include +#endif + +#ifndef _MM_GDT_H +#define _MM_GDT_H + +//----------------------------------------------------------------------------// + +#define IOMAP_SIZE (8 * 1024) + +//----------------------------------------------------------------------------// + +// The gdt entry +struct GdtEntry_t +{ + ushort lowLimit; // lower 16 bits + ushort lowBase; // lower 16 bits + uchar middleBase; // next 8 bits + uchar access; // determine what ring this segment can be used in + uchar flags; + uchar highBase; // last 8 bits +} __attribute__((__packed__)); + +struct TssDescriptor_t +{ + ushort lowLimit; + ushort lowBase; + uchar middleBase; + uchar access; + uchar flags; + uchar highBase; + uint veryHighBase; + uint reserved; +} __attribute__ ((packed)); + +struct Tss_t +{ + uint reserved1; + + // Stack pointers (RSP) for privilege levels 0-2 + ulong rsp0; + ulong rsp1; + ulong rsp2; + ulong reserved2; + + // Interrupt stack table pointers + ulong ist1; + ulong ist2; + ulong ist3; + ulong ist4; + ulong ist5; + ulong ist6; + ulong ist7; + ulong reserved3; + ushort reserved4; + + // Offset to the I/O permission bit map from the 64-bit TSS base + ushort iomap_base; + uchar iomap[IOMAP_SIZE]; + +} __attribute__ ((packed)) __attribute__((aligned(8))); + +// The gdt pointer +struct GdtPtr_t +{ + ushort limit; // upper 16 bits + ulong base; // address of the first entry +} __attribute__((__packed__)); + +//----------------------------------------------------------------------------// + +// +// Initializes the descriptor table +// +void MmInitGdt(void); + +// +// Loads the descriptor table +// +extern void MmLoadGdt(GdtPtr_t *gdtPtr, ushort tssOffset); + + +// +// Stores the descriptor table +// +extern void MmStoreGdt(void); + +//----------------------------------------------------------------------------// + +#endif diff --git a/include/mm/map.h b/include/mm/map.h new file mode 100644 index 0000000..d7c9ea7 --- /dev/null +++ b/include/mm/map.h @@ -0,0 +1,85 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Desc: Mapping and checking memory related functions // +// // +// // +// Copyright © 2018-2019 The OS/K Team // +// // +// This file is part of OS/K. // +// // +// OS/K is free software: you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation, either version 3 of the License, or // +// any later version. // +// // +// OS/K is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY//without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with OS/K. If not, see . // +//----------------------------------------------------------------------------// + +#ifndef _KERNEL_H +#include +#endif + +#ifndef _MM_MAP_H +#define _MM_MAP_H + +//----------------------------------------------------------------------------// + +#define MINIMUM_RAM_SIZE 16 // Mio, the minimum RAM size. + +#define AVAILABLE_ZONE 1 // Fully usable RAM zone +#define RESERVED_ZONE 2 // Used by the firmware +#define ACPI_ZONE 3 // Used by ACPI but can be freed +#define NVS_ZONE 4 // Dunno +#define BADRAM_ZONE 5 // Invalid zone because material problem... +#define MAX_ENTRIES 2048 // Max number of memory map entries + +//----------------------------------------------------------------------------// + +// The entry structure of the map +struct MapEntry_t { + void *addr; + size_t length; // in bytes + uint type; // reserved or not +} __attribute__((__packed__)); + +// the map structure +struct MemoryMap_t { + size_t length; + size_t freeRamSize; + size_t nonfreeRamSize; + MapEntry_t entry[MAX_ENTRIES]; +} __attribute__((__packed__)); + +//----------------------------------------------------------------------------// + +// +// Initializes the memory map structure +// +void MmInitMemoryMap(void); + +// +// Initializes the memory map structure +// +void MmPrintMemoryMap(void); + +// +// Returns the size of the first available memory zone +// from the start address pointer +// +size_t MmGetAvailZoneSize(void *start); + +// +// Returns the first available memory zone from the start address pointer +// +void *MmGetFirstAvailZone(void *start); + +//----------------------------------------------------------------------------// + +#endif diff --git a/include/mm/paging.h b/include/mm/paging.h new file mode 100644 index 0000000..c25ed08 --- /dev/null +++ b/include/mm/paging.h @@ -0,0 +1,92 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Desc: Paging memory related functions // +// // +// // +// Copyright © 2018-2019 The OS/K Team // +// // +// This file is part of OS/K. // +// // +// OS/K is free software: you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation, either version 3 of the License, or // +// any later version. // +// // +// OS/K is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY//without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with OS/K. If not, see . // +//----------------------------------------------------------------------------// + +#ifndef _KERNEL_H +#include +#endif + +#ifndef _MM_PAGING_H +#define _MM_PAGING_H + +//----------------------------------------------------------------------------// + +#define KPAGESIZE (4 * KB) +#define UPAGESIZE (4 * KB) + +//----------------------------------------------------------------------------// + +// Page table entry +typedef ulong pte_t; + +// Page directory offset +typedef pte_t* pde_t; + +// Page directory pointer offset +typedef pde_t* pdpe_t; + +// Page directory L4 pointer offset +typedef pdpe_t* pml4_t; + +//----------------------------------------------------------------------------// + +// +// Paging activation +// +void MmInitPaging(void); + +void MmActivatePageHandler(void); + +// +// Returns the address of the stack guard pages +// +void *MmGetStackGuards(char rank); + +// +// Translate a virtual address into physical address and the opposite +// +void *MmTransVirtToPhyAddr(void*); +void *MmTransPhyToVirtAddr(void* virtualAddr); + +// +// Set flags to a page +// +void MmSetPage(void* virtualAddr, ulong flags); +void MmUnSetPage(void* virtualAddr, ulong flags); + +// +// Map a page +// +void MmMapPage(void* virtualAddr, void* physicalAddr, ulong flags); +void MmUnmapPage(void* virtualAddr); + +// +// Paging misc +// +void MmLoadPML4(void *); +void MmEnableWriteProtect(void); +void MmDisableWriteProtect(void); + +//----------------------------------------------------------------------------// + +#endif