diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..2af24317bfbada57ff03952c222f657e1ccbb1f2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,96 @@ + +# Created by https://www.toptal.com/developers/gitignore/api/c,macos,vscode +# Edit at https://www.toptal.com/developers/gitignore?templates=c,macos,vscode + +### C ### +# Prerequisites +*.d + +# Object files +*.o +*.ko +*.obj +*.elf + +# Linker output +*.ilk +*.map +*.exp + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su +*.idb +*.pdb + +# Kernel Module Compile Results +*.mod* +*.cmd +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.conf + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### vscode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# End of https://www.toptal.com/developers/gitignore/api/c,macos,vscode \ No newline at end of file diff --git a/tpfs/Makefile b/tpfs/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..207480aee424dfdbeaa26b07660c2d70aa7592c4 --- /dev/null +++ b/tpfs/Makefile @@ -0,0 +1,40 @@ +# $Id: Makefile,v 1.2 2004/10/12 09:06:17 marquet Exp $ +############################################################################## + +ROOTDIR = ../x86-64/ + +CC = gcc +CFLAGS = -Wall -ansi -pedantic +CFLAGS += -g +LIBDIR = $(ROOTDIR)/lib +INCDIR = -I$(ROOTDIR)/include +LIBS = -L$(LIBDIR) -lhardware + +###------------------------------ +### Main targets +###------------------------------------------------------------ +BINARIES= mkhd display_sector + +all: $(BINARIES) $(OBJECTS) + + +###------------------------------ +### Main rules +###------------------------------------------------------------ +%.o: %.c + $(CC) $(CFLAGS) -c $< $(INCDIR) + +%: %.o + $(CC) $(CFLAGS) -o $@ $^ $(LIBS) + +mkhd: mkhd.o +display_sector: display_sector.o drive.o + +###------------------------------ +### Misc. +###------------------------------------------------------------ +.PHONY: clean realclean depend +clean: + $(RM) *.o $(BINARIES) +realclean: clean + $(RM) vdiskA.bin vdiskB.bin diff --git a/tpfs/display_sector.c b/tpfs/display_sector.c new file mode 100644 index 0000000000000000000000000000000000000000..5771e1940e3af10bb70161f66af18edcecedc6f7 --- /dev/null +++ b/tpfs/display_sector.c @@ -0,0 +1,59 @@ +#include <stdio.h> +#include <stdlib.h> + +#include "hardware.h" +#include "drive.h" + +/* Paramètres de la simulation */ +#define HDA_FILENAME "vdiskA.bin" /* nom du fichier de stockage du disque simulé */ + +static void +empty_it() +{ + return; +} + +void read_sector(unsigned char *buf, int cylinder, int sector) +{ + int i; + seek(cylinder, sector); + _out(HDA_DATAREGS, 0); + _out(HDA_DATAREGS + 1, 1); + _out(HDA_CMDREG, CMD_READ); + _sleep(HDA_IRQ); + + for (i = 0; i < HDA_SECTORSIZE; i++) + buf[i] = MASTERBUFFER[i]; +} + +int main(int argc, char const *argv[]) +{ + unsigned int i; + unsigned char buffer[HDA_SECTORSIZE]; + + if (argc != 3) + { + fprintf(stderr, "Usage: %s <cylinder> <sector>\n", argv[0]); + exit(EXIT_FAILURE); + } + + /* init hardware */ + if (init_hardware("hwconfig.ini") == 0) + { + fprintf(stderr, "Error in hardware initialization\n"); + exit(EXIT_FAILURE); + } + + /* Interreupt handlers */ + for (i = 0; i < 16; i++) + IRQVECTOR[i] = empty_it; + + /* Allows all IT */ + _mask(1); + + read_sector(buffer, atoi(argv[1]), atoi(argv[2])); + dump(buffer, HDA_SECTORSIZE, 1, 0); + + /* and exit! */ + exit(EXIT_SUCCESS); +} diff --git a/tpfs/drive.c b/tpfs/drive.c new file mode 100644 index 0000000000000000000000000000000000000000..8bf2dbc9c258b92995ea0d24b2e20849cff5457c --- /dev/null +++ b/tpfs/drive.c @@ -0,0 +1,56 @@ +#include <stdio.h> +#include <ctype.h> + +#include "hardware.h" +#include "drive.h" + +void dump(unsigned char *buffer, + unsigned int buffer_size, + int ascii_dump, + int octal_dump) +{ + int i, j; + + for (i = 0; i < buffer_size; i += 16) + { + /* offset */ + printf("%.8o", i); + + /* octal dump */ + if (octal_dump) + { + for (j = 0; j < 8; j++) + printf(" %.2x", buffer[i + j]); + printf(" - "); + + for (; j < 16; j++) + printf(" %.2x", buffer[i + j]); + + printf("\n"); + } + /* ascii dump */ + if (ascii_dump) + { + printf("%8c", ' '); + + for (j = 0; j < 8; j++) + printf(" %1c ", isprint(buffer[i + j]) ? buffer[i + j] : ' '); + printf(" - "); + + for (; j < 16; j++) + printf(" %1c ", isprint(buffer[i + j]) ? buffer[i + j] : ' '); + + printf("\n"); + } + } +} + +void seek(int cylinder, int sector) +{ + _out(HDA_DATAREGS, (cylinder >> 8) & 256); + _out(HDA_DATAREGS + 1, cylinder & 256); + _out(HDA_DATAREGS + 2, (sector >> 8) & 256); + _out(HDA_DATAREGS + 3, sector & 256); + _out(HDA_CMDREG, CMD_SEEK); + _sleep(HDA_IRQ); +} \ No newline at end of file diff --git a/tpfs/drive.h b/tpfs/drive.h new file mode 100644 index 0000000000000000000000000000000000000000..baa68d6e020944c11841d4964c7a3e5d80f62925 --- /dev/null +++ b/tpfs/drive.h @@ -0,0 +1,19 @@ +#if !defined(DRIVE) +#define DRIVE + +/* Paramètres du contrôleur IDE */ +#define ENABLE_HDA 1 /* 0 => simulation du disque désactivée */ +#define HDA_CMDREG 0x3F6 /* registre de commande du disque maitre */ +#define HDA_DATAREGS 0x110 /* base des registres de données (r,r+1...r+15) */ +#define HDA_IRQ 14 /* Interruption du disque */ +#define CMD_SEEK 0x02 +#define CMD_READ 0x04 +#define HDA_SECTORSIZE 256 + +void dump(unsigned char *buffer, + unsigned int buffer_size, + int ascii_dump, + int octal_dump); +void seek(int cylinder, int sec); + +#endif diff --git a/tpfs/hwconfig.ini b/tpfs/hwconfig.ini new file mode 100644 index 0000000000000000000000000000000000000000..91712606fb772468f3958657e29fe8555b1f5864 --- /dev/null +++ b/tpfs/hwconfig.ini @@ -0,0 +1,125 @@ +# +# Hardware.cfg +# Fichier de configuration du simulateur de mat�riel +# +# + +# +# Trace de Debug +# +# define DEBUG_SETUP 0x0001 /* trace hardware setup */ +# define DEBUG_IT 0x0010 /* trace interruptions generation */ +# define DEBUG_REG 0x0100 /* trace hardware register access */ +# define DEBUG_WARNING 0x1000 /* trace hardware warning messages */ +DEBUG = 0x0000 + +# +# Configuration des param�tres de base du simulateur +# +SYSTICK = 1000 # delais entre deux ticks du simulateur (en micro-seconde) +MemSize = 1024 # taille de la m�moire centrale en Ko + +# +# Configuration des mat�riels r�seau +# +# configuration des ports COM (port serie de type RS232) +# > Port Serie n�1 +SL1_ENABLE = 0 # SL1_ENABLE = 0 => simulation lien serie d�sactiv�e +SL1 = "chimay.lifl.fr" # Machine connect� � la sortie du lien serie n�1 +SL1_COM = 1 # destinataire 1 = lien serie "com1", 2 = lien serie "com2" +SL1_NOISE = 500 # bruit de la ligne 0-999 (exprim� en /1000 d'erreur) +SL1_IRQ = 4 # niveau d'interruption de l'UART serie n�1 +SL1_UARTSR = 0x3F8 # registre de status de l'UART serie n�1 +SL1_UARTDATA = 0x3FA # registre d'entr�e sortie de l'UART serie n�1 +SL1_UDPPORT = 1500 # port UDP "r�el" utiliser pour simulation serie n�1 +# > Port Serie n�2 +SL2_ENABLE = 0 # SL2_ENABLE = 0 => simulation lien serie d�sactiv�e +SL2 = "ldx2" # Machine connect� � la sortie du lien serie n�2 +SL2_COM = 2 # destinataire 1 = lien serie "com1", 2 = lien serie "com2" +SL2_NOISE = 0 # bruit de la ligne 0-999 (exprim� en /1000 d'erreur) +SL2_IRQ = 5 # niveau d'interruption de l'UART serie n�2 +SL2_UARTSR = 0x3FC # registre de status de l'UART serie n�2 +SL2_UARTDATA = 0x3FE # registre d'entr�e sortie de l'UART serie n�2 +SL2_UDPPORT = 1501 # port UDP "r�el" utiliser pour simulation serie n�2 +# > Configuration de la carte Ethernet +ENABLE_ETHERNET = 0 # ENABLE_ETHERNET = 0 => simulation ethernet d�sactiv�e +Eth0_Link = 1 # num de cable de connexion de la carte Eth0 +Eth0_DMASR = 0xE800 # registre de status de la carte Ethernet +Eth0_DMABASE = 0xE804 # adresse de base pour le vidage d'un paquet +Eth0_DMASIZE = 0xE808 # adresse limite pour le vidage d'un paquet +Eth0_IRQ = 9 # niveau d'interruption de la carte. +Eth0_MCADR = "225.0.0.1" # adresse multicast utilis�e pour la simulation ethernet +Eth0_UDPPORT = 1502 # port UDP utilis� pour la simulation ethernet + + + +# +# Configuration des disques durs +# + +########################### +# > Disque dur IDE Maitre # +########################### +# Param�tres du controlleur IDE +ENABLE_HDA = 1 # ENABLE_HD = 0 => simulation du disque d�sactiv�e +HDA_CMDREG = 0x3F6 # registre de commande du disque maitre +HDA_DATAREGS = 0x110 # base des registres de donn�es (r,r+1,r+2,...r+15) +HDA_IRQ = 14 # Interruption du disque + +# Param�tres de la simulation +HDA_FILENAME = "vdiskA.bin" # nom du fichier de stockage du disque simul� +HDA_STPS = 2 # nombre de SYSTICK pour changer de secteur +HDA_STPC = 1 # nombre de SYSTICK pour changer de piste +HDA_PON_DELAY = 30 # nombre de SYSTICK avant amorce du disque +HDA_POFF_DELAY = 30 # nombre de SYSTICK avant arret du disque + +# Param�tres additionels du disque (Utilisez la commande dsknfo pour obtenir ces infos) +HDA_MAXCYLINDER = 16 # Nombre de pistes du disque ma�tre +HDA_MAXSECTOR = 16 # Nombre de secteurs du disque ma�tre +HDA_SECTORSIZE = 256 # Taille (en octet) d'un secteur du disque ma�tre + +############################ +# > Disque dur IDE Esclave # +############################ +# Param�tres du controlleur IDE +ENABLE_HDB = 1 # ENABLE_HD = 0 => simulation du disque d�sactiv�e +HDB_CMDREG = 0x376 # registre de commande du disque esclave +HDB_DATAREGS = 0x170 # base des registres de donn�es (r,r+1,r+2,...r+15) +HDB_IRQ = 15 # Niveau d'interruption du disque + +# Param�tres de la simulation +HDB_FILENAME = "vdiskB.bin" # nom du fichier de stockage du disque simul� +HDB_STPS = 2 # nombre de SYSTICK pour changer de secteur +HDB_STPC = 3 # nombre de SYSTICK pour changer de piste +HDB_PON_DELAY = 30 # nombre de SYSTICK avant amorce du disque +HDB_POFF_DELAY = 30 # nombre de SYSTICK avant arret du disque + +# Param�tres additionels du disque (Utilisez la commande dsknfo pour obtenir ces infos) +HDB_MAXCYLINDER = 16 # Nombre de pistes du disque esclave +HDB_MAXSECTOR = 16 # Nombre de secteurs du disque esclave +HDB_SECTORSIZE = 512 # Taille (en octet) d'un secteur du disque esclave + + + +# +# Configuration de l'horologe interne +# +TIMER_CLOCK = 0xF0 # registre de lecture de la date courante (en ms) +TIMER_PARAM = 0xF4 # registre de configuration du TIMER + # bit 7 : RESET general (=1) + # bit 6 : Alarm ON = 1, Alarm OFF = 0 + # bit 5 : Declanche la division Hz du Timer (=1) + # bit 4 \ Si le division Hz du timer est demand� : + # bit 3 / 00: 1 top d'alarme pour 1 tops d'horloge , + # 01: 1 top d'alarme pour 8 tops d'horloge , + # 10: 1 top d'alarme pour 64 tops d'horloge , + # 11: 1 top d'alarme pour 512 tops d'horloge. + # bit 2 - R.F.U. - + # bit 1 \ Lecture d'un �tat interne de l'alarme + # bit 0 / 00: Alarme Courante, + # 01: Division Hz, + # 10: Ticks/Sec + # 11: niveau d'interruption de l'horloge +TIMER_ALARM = 0xF8 # registre de generation d'interruption +TIMER_IRQ = 2 # Niveau d'interruption de l'horologe +TIMER_TICKS = 1 # Nombre de SYSTICKS par tick d'horloge diff --git a/tpfs/mkhd.c b/tpfs/mkhd.c new file mode 100644 index 0000000000000000000000000000000000000000..fdc338fbe9c6800b21d31388ccb88bdbbeb91cbc --- /dev/null +++ b/tpfs/mkhd.c @@ -0,0 +1,44 @@ +/* ------------------------------ + $Id: mkhd.c,v 1.4 2004/10/12 09:16:57 marquet Exp $ + ------------------------------------------------------------ + + Create and intialize a drive using the hardware simulator. + Philippe Marquet, october 2002 + + A minimal example of a program using the ATA interface. + It is given to the students as such. + +*/ + +#include <stdlib.h> +#include <stdio.h> +#include "hardware.h" + +static void +empty_it() +{ + return; +} + +int main(int argc, char **argv) +{ + unsigned int i; + + /* init hardware */ + if (init_hardware("hwconfig.ini") == 0) + { + fprintf(stderr, "Error in hardware initialization\n"); + exit(EXIT_FAILURE); + } + + /* Interrupt handlers */ + for (i = 0; i < 16; i++) + IRQVECTOR[i] = empty_it; + + /* Allows all IT */ + _mask(1); + + + /* and exit! */ + exit(EXIT_SUCCESS); +} diff --git a/x86-64/etc/.gitkeep b/x86-64/etc/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/x86-64/etc/hardware.ini b/x86-64/etc/hardware.ini new file mode 100644 index 0000000000000000000000000000000000000000..d297143acd2792e8d1a5d4776563e4254146e28d --- /dev/null +++ b/x86-64/etc/hardware.ini @@ -0,0 +1,134 @@ +# $Id: hardware.ini 114 2009-12-01 13:06:43Z simon_duquennoy $ +#------------------------------------------------------------ + +# +# Hardware.cfg +# Fichier de configuration du simulateur de mat�riel +# + +# +# Trace de Debug +# +# define DEBUG_SETUP 0x0001 /* trace hardware setup */ +# define DEBUG_IT 0x0010 /* trace interruptions generation */ +# define DEBUG_REG 0x0100 /* trace hardware register access */ +# define DEBUG_WARNING 0x1000 /* trace hardware warning messages */ +DEBUG = 0x0000 + +# +# Configuration des param�tres de base du simulateur +# +SYSTICK = 1000 # delais entre deux ticks du simulateur (en micro-seconde) + +# +# Configuration des mat�riels r�seau +# +# configuration des ports COM (port serie de type RS232) +# > Port Serie n�1 +SL1_ENABLE = 0 # SL1_ENABLE = 0 => simulation lien serie d�sactiv�e +SL1 = "chimay.lifl.fr" # Machine connect� � la sortie du lien serie n�1 +SL1_COM = 1 # destinataire 1 = lien serie "com1", 2 = lien serie "com2" +SL1_NOISE = 500 # bruit de la ligne 0-999 (exprim� en /1000 d'erreur) +SL1_IRQ = 4 # niveau d'interruption de l'UART serie n�1 +SL1_UARTSR = 0x3F8 # registre de status de l'UART serie n�1 +SL1_UARTDATA = 0x3FA # registre d'entr�e sortie de l'UART serie n�1 +SL1_UDPPORT = 1500 # port UDP "r�el" utiliser pour simulation serie n�1 +# > Port Serie n�2 +SL2_ENABLE = 0 # SL2_ENABLE = 0 => simulation lien serie d�sactiv�e +SL2 = "ldx2" # Machine connect� � la sortie du lien serie n�2 +SL2_COM = 2 # destinataire 1 = lien serie "com1", 2 = lien serie "com2" +SL2_NOISE = 0 # bruit de la ligne 0-999 (exprim� en /1000 d'erreur) +SL2_IRQ = 5 # niveau d'interruption de l'UART serie n�2 +SL2_UARTSR = 0x3FC # registre de status de l'UART serie n�2 +SL2_UARTDATA = 0x3FE # registre d'entr�e sortie de l'UART serie n�2 +SL2_UDPPORT = 1501 # port UDP "r�el" utiliser pour simulation serie n�2 +# > Configuration de la carte Ethernet +ENABLE_ETHERNET = 0 # ENABLE_ETHERNET = 0 => simulation ethernet d�sactiv�e +Eth0_Link = 1 # num de cable de connexion de la carte Eth0 +Eth0_DMASR = 0xE800 # registre de status de la carte Ethernet +Eth0_DMABASE = 0xE804 # adresse de base pour le vidage d'un paquet +Eth0_DMASIZE = 0xE808 # adresse limite pour le vidage d'un paquet +Eth0_IRQ = 9 # niveau d'interruption de la carte. +Eth0_MCADR = "225.0.0.1" # adresse multicast utilis�e pour la simulation ethernet +Eth0_UDPPORT = 1502 # port UDP utilis� pour la simulation ethernet + +# +# Configuration des disques durs +# + +# > Disque dur IDE Maitre +ENABLE_HDA = 1 # ENABLE_HD = 0 => simulation du disque d�sactiv�e +HDA_FILENAME = "vdiskA.bin" # nom du fichier de stockage du disque simul� +HDA_CMDREG = 0x3F6 # registre de commande du disque maitre +HDA_DATAREGS = 0x110 # base des registres de donn�es (r,r+1,r+2,...r+7) +HDA_IRQ = 14 # Interruption du disque +HDA_MAXCYLINDER = 16 # Nombre de pistes du disque ma�tre +HDA_MAXSECTOR = 16 # Nombre de secteurs du disque ma�tre +HDA_SECTORSIZE = 32 # Taille (en octet) d'un secteur du disque ma�tre +HDA_STPS = 2 # nombre de SYSTICK pour changer de secteur +HDA_STPC = 1 # nombre de SYSTICK pour changer de piste +HDA_PON_DELAY = 30 # nombre de SYSTICK avant amorce du disque +HDA_POFF_DELAY = 30 # nombre de SYSTICK avant arret du disque + +# > Disque dur IDE Esclave +ENABLE_HDB = 1 # ENABLE_HD = 0 => simulation du disque d�sactiv�e +HDB_FILENAME = "vdiskB.bin" # nom du fichier de stockage du disque simul� +HDB_CMDREG = 0x376 # registre de commande du disque esclave +HDB_DATAREGS = 0x170 # base des registres de donn�es (r,r+1,r+2,...r+7) +HDB_IRQ = 15 # Niveau d'interruption du disque +HDB_MAXCYLINDER = 16 # Nombre de pistes du disque esclave +HDB_MAXSECTOR = 16 # Nombre de secteurs du disque esclave +HDB_SECTORSIZE = 512 # Taille (en octet) d'un secteur du disque esclave +HDB_STPS = 2 # nombre de SYSTICK pour changer de secteur +HDB_STPC = 3 # nombre de SYSTICK pour changer de piste +HDB_PON_DELAY = 30 # nombre de SYSTICK avant amorce du disque +HDB_POFF_DELAY = 30 # nombre de SYSTICK avant arret du disque + +# +# Configuration de l'horologe interne +# +TIMER_CLOCK = 0xF0 # registre de lecture de la date courante (en ms) +TIMER_PARAM = 0xF4 # registre de configuration du TIMER + # bit 7 : RESET general (=1) + # bit 6 : Alarm ON = 1, Alarm OFF = 0 + # bit 5 : Declanche la division Hz du Timer (=1) + # bit 4 \ Si le division Hz du timer est demand� : + # bit 3 / 00: 1 top d'alarme pour 1 tops d'horloge , + # 01: 1 top d'alarme pour 8 tops d'horloge , + # 10: 1 top d'alarme pour 64 tops d'horloge , + # 11: 1 top d'alarme pour 512 tops d'horloge. + # bit 2 - R.F.U. - + # bit 1 \ Lecture d'un �tat interne de l'alarme + # bit 0 / 00: Alarme Courante, + # 01: Division Hz, + # 10: Ticks/Sec + # 11: niveau d'interruption de l'horloge +TIMER_ALARM = 0xF8 # registre de generation d'interruption +TIMER_IRQ = 2 # Niveau d'interruption de l'horologe +TIMER_TICKS = 1 # Nombre de SYSTICKS par tick d'horloge + +# +# Configuration de la MMU +# +MMU_ENABLE = 1 # MMU_ENABLE = 0 => simulation de la MMU d�sactiv�e +MMU_IRQ = 13 # Niveau d'interruption de la MMU +MMU_CMD = 0x66 # Registre de commande de la MMU +MMU_FAULT_ADDR = 0xCD # Registre contenant l'adresse m�moire ayant provoqu� une faute +TLB_ADD_ENTRY = 0xCE # Registre de commande d'ajout d'entr�e dans la TLB + # attend une valeur de la forme : + # struct tlb_entry_s { + # unsigned unused: 8; + # unsigned virt_page: 12; + # unsigned phys_page: 8; + # unsigned access_type: 3; + # unsigned is_active: 1; + #}; + # le nouveau mapping est ajout� dans la TLB, + # provoquant �ventuellement l'�crasement d'une ancienne entr�e +TLB_DEL_ENTRY = 0xDE # Registre de commande de suppression d'entr�e dans la TLB + # seul phys_page est lu, et toutes les entr�e + # correspondant � cette page physicique sont supprim�es de la TLB +TLB_SIZE = 32 # Number of entries in the TLB +TLB_ENTRIES = 0x800 # Registre contenant les entr�es de la TLB (32 bits par entr�e) + # Accessible en lecture comme en �criture avec le m�me format que + # celui utilis� par TLB_ADD_ENTRY diff --git a/x86-64/include/.gitkeep b/x86-64/include/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/x86-64/include/hardware.h b/x86-64/include/hardware.h new file mode 100644 index 0000000000000000000000000000000000000000..14a3726125b5f212d814ee21fc76f1ee2a994784 --- /dev/null +++ b/x86-64/include/hardware.h @@ -0,0 +1,127 @@ +/* ------------------------------ + $Id: hardware.h 114 2009-12-01 13:06:43Z simon_duquennoy $ + ------------------------------------------------------------ + + hardware.h + + Interface de la biblioth�que de simulation du mat�riel. + +*/ + +#ifndef _HARDWARE_H_ +#define _HARDWARE_H_ + +/** + * CMD_ + * commandes ATA-2 + */ +#define CMD_SEEK 0x02 +#define CMD_READ 0x04 +#define CMD_WRITE 0x06 +#define CMD_FORMAT 0x08 +#define CMD_STATUS 0x12 +#define CMD_DMASET 0x14 +#define CMD_DSKINFO 0x16 +#define CMD_MANUF 0xA2 +#define CMD_DIAG 0xA4 + +/** + * Commandes de la MMU (registre MMU_CMD) + */ +#define MMU_PROCESS 0xCC /* Commande d'activation/d�sactivation de la MMU */ +#define MMU_RESET 0xD5 /* Commande de r�initialisation de la MMU */ + +/** + * Physical and virtual memory for MMU + */ +extern void *physical_memory; +extern void *virtual_memory; + +/** + * prototype des fonctions-interruptions. + * une interruption ne recoit aucun param�tre "d'appel", + * une interruption ne retourne aucun resultat, mais + * sa terminaison restaure le contexte d'ex�cution du programme interrompu. + */ +typedef void (*func_irq)(void); + +/** + * int init_hardware(const char *fileconfig); + * initialisation du mat�riel. Pas de "reinitialisation" possible. + * l'initialisation d�finit le mat�riel conform�ment aux sp�cifications + * fournies par le fichier dont le nom est "fileconfig". + * retourne 0 en cas de probl�me lors de l'initialisation. + */ +extern int init_hardware(const char *fileconfig); + +/** + * IRQVECTOR + * donne la base d'un tableau de pointeur de fonction du type + * func_irq. la fonction IRQVECTOR[n]() est appel�e lorsque + * l'interuption de niveau n est d�clanch�e par le mat�riel. + */ +#define IRQ_VECOTR_SIZE 256 +extern func_irq *irq_vector; /* n'utilisez pas cette variable */ +#define IRQVECTOR irq_vector /* pr�f�rez ce #define IRQVECTOR */ + +extern int SYSTICKDURATION; /* microseconde entre les SYSTICK */ + +/** + * MASTERBUFFER et SLAVEBUFFER + * Adresses des buffers de donnees des disques maitre et esclave + */ +/* n'utilisez pas ces variables*/ +extern unsigned char ** HDA_masterbufferaddress, **HDB_masterbufferaddress; +/* pr�f�rez ces #define MASTERBUFFER et SLAVEBUFFER */ +#define MASTERBUFFER (*HDA_masterbufferaddress) +#define SLAVEBUFFER (*HDB_masterbufferaddress) + +/** + * BASEADDRESS_RAM + * variable associ�e � adresse de base de la m�moire globale + * de la machine. Cette m�moire est commune � tout les programmes + * qui utilisent la librairie sur la m�me machine. + * + */ +extern unsigned char *baseGlobalMem; /* n'utilisez pas cette variable */ +#define BASEADDRESS_RAM baseGlobalMem /* pr�f�rez ce #define BASEADDRESS_RAM */ + +/** + * int _in(int port); + * lecture du contenu du registre mat�riel n� "port". + * retourne la valeur lue. + */ +int _in(int port); + +/** + * void _out(int port, int value); + * ecriture de la valeur "value" dans le registre mat�riel n� "port". + */ +void _out(int port, int value); + +/** + * void _sleep(int irq_level); + * Stoppe l'activit� du microprocesseur jusqu'� l'occurence + * une interruption de niveau au moins �gale � "irqLevel". + */ +void _sleep(int irq_level); + +/** + * void _mask(int irqLevel); + * - cache au microprocesseur l'occurence d'interruptions + * de niveau inf�rieure � irqLevel. + * - 16�me bit � 0 : passage en mode prot�g� + * - 16�me bit � 1 : passage en mode user + * + */ +void _mask(int irq_level); + +/** + * void _int(int irqLevel); + * - lance une interruption logicielle de niveau irqLevel + * + */ +void _int(int irqLevel); + +#endif + diff --git a/x86-64/include/hw_config.h b/x86-64/include/hw_config.h new file mode 100644 index 0000000000000000000000000000000000000000..352f8ce217cf9a8645f2c9b1d22d3a1d3340094a --- /dev/null +++ b/x86-64/include/hw_config.h @@ -0,0 +1,25 @@ +/* ------------------------------ + $Id: hw_config.h 86 2007-06-01 14:34:35Z skaczmarek $ + ------------------------------------------------------------ + + Fichier de configuration des acces au materiel + + Philippe Marquet, march 2007 + + Code au niveau applicatif la description du materiel qui est fournie + par hardware.ini + +*/ + +#ifndef _HW_CONFIG_H_ +#define _HW_CONFIG_H_ + +#define INIFILENAME "hwconfig.ini" + +/* Horloge */ +#define TIMER_CLOCK 0xF0 +#define TIMER_PARAM 0xF4 +#define TIMER_ALARM 0xF8 +#define TIMER_IRQ 2 + +#endif diff --git a/x86-64/lib/.gitkeep b/x86-64/lib/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391