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