2019-03-14 18:33:12 +01:00
|
|
|
//----------------------------------------------------------------------------//
|
|
|
|
// GNU GPL OS/K //
|
|
|
|
// //
|
2019-05-13 23:22:27 +02:00
|
|
|
// Desc: Memory manager functions //
|
2019-03-14 18:33:12 +01:00
|
|
|
// //
|
|
|
|
// //
|
|
|
|
// 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 <https://www.gnu.org/licenses/>. //
|
|
|
|
//----------------------------------------------------------------------------//
|
2019-03-18 17:43:41 +01:00
|
|
|
|
2019-05-13 23:22:27 +02:00
|
|
|
#ifndef _KERNEL_H
|
|
|
|
#include <kernel.h>
|
2019-03-29 10:29:05 +01:00
|
|
|
#endif
|
2019-03-18 17:43:41 +01:00
|
|
|
|
2019-05-13 23:22:27 +02:00
|
|
|
#ifndef _MM_MM_H
|
|
|
|
#define _MM_MM_H
|
2019-04-21 21:18:13 +02:00
|
|
|
|
|
|
|
//----------------------------------------------------------------------------//
|
|
|
|
|
2019-03-24 20:25:11 +01:00
|
|
|
#define MINIMUM_RAM_SIZE 16 // Mio, the minimum RAM size.
|
2019-05-19 23:33:34 +02:00
|
|
|
#define IOMAP_SIZE (8 * 1024)
|
2019-03-24 20:25:11 +01:00
|
|
|
|
|
|
|
#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
|
2019-05-22 00:38:04 +02:00
|
|
|
#define KPAGESIZE (4 * KB)
|
|
|
|
#define UPAGESIZE (2 * MB)
|
2019-03-24 20:25:11 +01:00
|
|
|
|
2019-04-21 21:18:13 +02:00
|
|
|
//----------------------------------------------------------------------------//
|
|
|
|
|
2019-03-24 20:25:11 +01:00
|
|
|
// The entry structure of the map
|
|
|
|
struct MapEntry_t {
|
|
|
|
void *addr;
|
|
|
|
size_t length; // in bytes
|
|
|
|
uint type; // reserved or not
|
2019-03-25 17:33:51 +01:00
|
|
|
} __attribute__((__packed__));
|
2019-03-24 20:25:11 +01:00
|
|
|
|
|
|
|
// the map structure
|
|
|
|
struct MemoryMap_t {
|
|
|
|
size_t length;
|
|
|
|
size_t freeRamSize;
|
|
|
|
size_t nonfreeRamSize;
|
|
|
|
MapEntry_t entry[MAX_ENTRIES];
|
2019-03-25 17:33:51 +01:00
|
|
|
} __attribute__((__packed__));
|
2019-03-21 13:30:17 +01:00
|
|
|
|
2019-05-19 23:33:34 +02:00
|
|
|
// The gdt entry
|
2019-03-26 17:50:03 +01:00
|
|
|
struct GdtEntry_t
|
|
|
|
{
|
2019-05-13 18:07:45 +02:00
|
|
|
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
|
2019-05-19 23:33:34 +02:00
|
|
|
uchar flags;
|
2019-05-13 18:07:45 +02:00
|
|
|
uchar highBase; // last 8 bits
|
2019-04-05 10:20:10 +02:00
|
|
|
} __attribute__((__packed__));
|
2019-03-24 20:25:11 +01:00
|
|
|
|
2019-05-13 18:07:45 +02:00
|
|
|
struct TssDescriptor_t
|
|
|
|
{
|
2019-05-22 00:38:04 +02:00
|
|
|
ushort lowLimit;
|
|
|
|
ushort lowBase;
|
|
|
|
uchar middleBase;
|
|
|
|
uchar access;
|
|
|
|
uchar flags;
|
|
|
|
uchar highBase;
|
|
|
|
uint veryHighBase;
|
|
|
|
uint reserved;
|
2019-05-13 18:07:45 +02:00
|
|
|
} __attribute__ ((packed));
|
|
|
|
|
2019-05-19 23:33:34 +02:00
|
|
|
struct Tss_t
|
2019-05-13 18:07:45 +02:00
|
|
|
{
|
2019-05-19 23:33:34 +02:00
|
|
|
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];
|
2019-05-13 18:07:45 +02:00
|
|
|
|
|
|
|
} __attribute__ ((packed));
|
|
|
|
|
|
|
|
|
|
|
|
|
2019-03-27 17:29:39 +01:00
|
|
|
// The gdt pointer
|
2019-03-26 17:50:03 +01:00
|
|
|
struct GdtPtr_t
|
|
|
|
{
|
2019-05-20 20:28:18 +02:00
|
|
|
ushort limit; // upper 16 bits
|
2019-05-19 23:33:34 +02:00
|
|
|
ulong base; // address of the first entry
|
2019-04-21 21:18:13 +02:00
|
|
|
} __attribute__((__packed__));
|
2019-03-24 20:25:11 +01:00
|
|
|
|
2019-04-21 21:18:13 +02:00
|
|
|
//----------------------------------------------------------------------------//
|
2019-03-18 17:43:41 +01:00
|
|
|
|
|
|
|
//
|
|
|
|
// Initializes the memory map structure
|
|
|
|
//
|
2019-03-29 10:29:05 +01:00
|
|
|
void MmInitMemoryMap(void);
|
2019-03-18 17:43:41 +01:00
|
|
|
|
2019-03-30 14:58:12 +01:00
|
|
|
//
|
|
|
|
// Initializes the memory map structure
|
|
|
|
//
|
|
|
|
void MmPrintMemoryMap(void);
|
|
|
|
|
2019-03-24 20:25:11 +01:00
|
|
|
//
|
2019-03-25 17:33:51 +01:00
|
|
|
// Returns the size of the first available memory zone
|
|
|
|
// from the start address pointer
|
2019-03-24 20:25:11 +01:00
|
|
|
//
|
2019-03-24 21:16:19 +01:00
|
|
|
size_t MmGetAvailZoneSize(void *start);
|
2019-03-24 20:25:11 +01:00
|
|
|
|
|
|
|
//
|
|
|
|
// Returns the first available memory zone from the start address pointer
|
2019-03-26 17:50:03 +01:00
|
|
|
//
|
2019-03-24 21:24:21 +01:00
|
|
|
void *MmGetFirstAvailZone(void *start);
|
2019-03-24 20:25:11 +01:00
|
|
|
|
2019-03-26 17:50:03 +01:00
|
|
|
//
|
2019-03-27 17:29:39 +01:00
|
|
|
// Initializes the descriptor table
|
2019-03-26 17:50:03 +01:00
|
|
|
//
|
|
|
|
void MmInitGdt(void);
|
2019-03-27 17:29:39 +01:00
|
|
|
|
|
|
|
//
|
|
|
|
// Loads the descriptor table
|
|
|
|
//
|
2019-05-22 00:38:04 +02:00
|
|
|
extern void MmLoadGdt(GdtPtr_t *gdtPtr, ushort tssOffset);
|
2019-05-13 18:07:45 +02:00
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
// Stores the descriptor table
|
|
|
|
//
|
|
|
|
extern void MmStoreGdt(void);
|
2019-03-27 17:29:39 +01:00
|
|
|
|
2019-05-23 14:50:05 +02:00
|
|
|
void MmInitPaging(void);
|
|
|
|
|
|
|
|
void MmReloadPaging(void);
|
|
|
|
|
|
|
|
void MmActivatePageHandler(void);
|
|
|
|
|
2019-05-22 08:11:50 +02:00
|
|
|
//
|
|
|
|
// Returns the address of the stack guard pages
|
|
|
|
//
|
|
|
|
void *MmGetStackGuards(char rank);
|
|
|
|
|
|
|
|
//
|
|
|
|
// Translate a virtual address into physical address
|
|
|
|
//
|
|
|
|
void *MmTranslateKPageToAddr(void *rank);
|
|
|
|
|
2019-11-16 22:41:46 +01:00
|
|
|
// Page directory pointer offset
|
|
|
|
typedef ulong pdpe_t;
|
|
|
|
|
|
|
|
// Page directory offset
|
|
|
|
typedef ulong pde_t;
|
|
|
|
|
|
|
|
// Page table entry
|
|
|
|
typedef ulong pte_t;
|
|
|
|
|
|
|
|
// paging.asm
|
|
|
|
void MmLoadPML4(void *);
|
|
|
|
void MmEnableWriteProtect(void);
|
|
|
|
void MmDisableWriteProtect(void);
|
|
|
|
void *MmGetStackGuards(char rank);
|
|
|
|
|
2019-04-21 21:18:13 +02:00
|
|
|
//----------------------------------------------------------------------------//
|
|
|
|
|
|
|
|
#endif
|