86 lines
3.0 KiB
C
Executable File
86 lines
3.0 KiB
C
Executable File
/***********************************/
|
|
/* Librairie LDT.h */
|
|
/* 23 Mars 2007 */
|
|
/***********************************/
|
|
|
|
#ifndef JREKCED_LDT
|
|
# define JREKCED_LDT
|
|
|
|
# include "type.h"
|
|
|
|
# define LDT_BLOC_SIZE (128) /* Nombre de descripteur LDT dans un bloc */
|
|
|
|
// Types d'acces
|
|
# define GLT_ACCESSED (0x1)
|
|
|
|
# define LDT_DATA (0x0)
|
|
# define LDT_DATA_WRITE (0x2)
|
|
# define LDT_DATA_EXPAND (0x4)
|
|
|
|
# define LDT_CODE (0x8)
|
|
# define LDT_CODE_READ (0xA)
|
|
# define LDT_CODE_CONFORMING (0xD)
|
|
|
|
// Granularite
|
|
# define LDT_BYTE (0x0)
|
|
# define LDT_4KB (0x1)
|
|
|
|
// Mode du CPU
|
|
# define LDT_16BIT (0x0)
|
|
# define LDT_32BIT (0x1)
|
|
|
|
|
|
typedef struct
|
|
{
|
|
UWORD Limite_0_15; // Bit 00-15 : Limite (0-15)
|
|
UWORD Adresse_0_15; // Bit 16-31 : Adresse (0-15)
|
|
UBYTE Adresse_16_23; // Bit 32-39 : Adresse (16-23)
|
|
UBYTE Acces : 1; // 0 = System
|
|
// 1 = Code ou data
|
|
UBYTE Type : 4; // Bit 41-44 : Type
|
|
UBYTE DPL : 2; // Spécifie le niveau de privilège du segment
|
|
UBYTE Present : 1; // Indique si le segment est en mémoire (bit a 1) ou non (bit a 0)
|
|
UBYTE Limite_16_19 : 4; // Bit 48-51 : Limite (16-19)
|
|
UBYTE UserDefine : 1; // Bit 52 : Utilisation libre
|
|
UBYTE Unused : 1; // Bit 53 : Non utilise (toujours = 0)
|
|
UBYTE CPUMode : 1; // Bit 54 : = 0 -> 16-Bit
|
|
// = 1 -> 32-Bit
|
|
UBYTE Granularite : 1; // Si = 0 : Limite = 1 octet -> 1 Mo
|
|
// Si = 1 : Limite = 4 Ko -> 4 Go
|
|
UBYTE Adresse_24_31; // Bit 56-63 : Adresse (24-31)
|
|
} T_LDT;
|
|
|
|
|
|
typedef struct
|
|
{
|
|
UWORD Size; // Taille de la GDT
|
|
void * Adresse; // Adresse phisique de la GDT;
|
|
UWORD Empty;
|
|
|
|
} T_LDT_reg;
|
|
|
|
|
|
// T_LDT *GDT_BASE = ((T_LDT*)0x0800L); /* Addresse physique ou reside la GDT, le 1e element est toujours null */
|
|
|
|
|
|
T_LDT * LDT_balloc (UWORD Size); // Alloue un bloc de Size LDT
|
|
|
|
int LDT_bfree (void * Adresse); // Libere un bloc LDT
|
|
|
|
T_LDT * LDT_brealloc (T_LDT * OldLDT, UWORD NewSize); // Redimensionne un bloc LDT, retourne NULL en cas d'erreur.
|
|
|
|
T_LDT * LDT_AllocLDT (T_LDT *BaseLDT); // Cherche un LDT libre dans un bloc precedement
|
|
// alloue avec LDT_balloc.
|
|
// Retourne NULL si aucun bloc disponible.
|
|
// Si un bloc libre est trouve, il est marque comme
|
|
// utilise et un pointeur sur ce LDT est retourne.
|
|
|
|
int LDT_FreeLDT (T_LDT *LDT); // Marque le LDT comme non utilise et le met a NULL.
|
|
|
|
int LDT_MapMemory (T_LDT *LDT, void * Linear, // Met des donnees dans un LDT.
|
|
UDWORD Size, // Cette fonction est a tester.
|
|
UBYTE Granularite,
|
|
UBYTE DPL, UBYTE Type,
|
|
UBYTE CPUMode);
|
|
#endif
|