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