Skip to content
Snippets Groups Projects
Commit daa5a43c authored by Thierno souleymane Bah's avatar Thierno souleymane Bah
Browse files

feat(master mode and user mode scenario test done)

parent cd775574
Branches
Tags
No related merge requests found
#define MMU_ENABLE 1
#define MMU_IRQ 13
#define MMU_CMD 0x66
#define MMU_FAULT_ADDR 0xCD
#define TLB_ADD_ENTRY 0xCE
#define TLB_DEL_ENTRY 0xDE
#define TLB_SIZE 32
#define TLB_ENTRIES 0x800
# $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_HI = 0xCD # Registre contenant l'adresse m�moire ayant provoqu� une faute
MMU_FAULT_ADDR_LO = 0xCC
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
INC=-I/vagrant/ASE/ordonnancement/x86-64/include INC=-I/vagrant/ASE/ordonnancement/x86-64/include
LIB=-L/vagrant/ASE/ordonnancement/x86-64/lib -lhardware LIB=-L/vagrant/ASE/ordonnancement/x86-64/lib -lhardware
all: try_mul pingpong pingpongpang all: try_mul pingpong pingpongpang mi_kernel
display_stack : display_stack.o display_stack : display_stack.o
gcc -o $@ $^ $(LIB) gcc -o $@ $^ $(LIB)
...@@ -15,8 +15,11 @@ pingpong : try.o pingpong.o ...@@ -15,8 +15,11 @@ pingpong : try.o pingpong.o
pingpongpang : try.o pingpongpang.o pingpongpang : try.o pingpongpang.o
gcc -o $@ $^ $(LIB) gcc -o $@ $^ $(LIB)
mi_kernel : mi_user.o mi_kernel.o
gcc -o $@ $^ $(LIB)
%.o:%.c %.o:%.c
gcc $(INC) -c $< gcc $(INC) -c $<
clean: clean:
rm -f *.o *.s display_stack try_mul pingpong pingpongpang vdisk?.bin rm -f *.o *.s display_stack try_mul pingpong pingpongpang vdisk?.bin mi_kernel
\ No newline at end of file \ No newline at end of file
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "hardware.h"
#include "mi_kernel.h"
#include "mi_user.h"
#include "MMUConfig.h"
#include "mi_syscall.h"
int current_process = 0;
void mmu_handler()
{
tlb_entry_t tlb;
long int vaddr = ((long int)_in(MMU_FAULT_ADDR_HI) << 32) | (_in(MMU_FAULT_ADDR_LO) & 0xFFFFFFFF);
long int vpage = (vaddr >> 12) & 0xFFF;
long int ppage = ppage_of_vpage(current_process, vpage);
//printf("%lx, %lx, %lx, %lx, %d\n", vpage, ppage, vaddr, (long int)virtual_memory, current_process);
if (vaddr < ((long int)virtual_memory) || vaddr > ((long int)virtual_memory) + VM_SIZE || ppage == -1)
{
fprintf(stderr, "Echec"); // TODO
exit(EXIT_FAILURE);
}
tlb.s.tlb_vpage = vpage;
tlb.s.tlb_ppage = ppage;
tlb.s.tlb_rwx = 7;
tlb.s.tlb_used = 1;
_out(TLB_ADD_ENTRY, tlb.i);
//_out(TLB_ADD_ENTRY, *(int *)(&tlb));
}
void switch_to_process0(void)
{
current_process = 0;
_out(MMU_CMD, MMU_RESET);
}
void switch_to_process1(void)
{
current_process = 1;
_out(MMU_CMD, MMU_RESET);
}
void init()
{
if (init_hardware("MMUConfig.ini") == 0)
{
fprintf(stderr, "ERROR INITHARDWARE");
exit(EXIT_FAILURE);
}
IRQVECTOR[16] = switch_to_process0;
IRQVECTOR[17] = switch_to_process1;
IRQVECTOR[MMU_IRQ] = mmu_handler;
}
int ppage_of_vpage(int process, unsigned vpage)
{
if (vpage < N)
{
if (process == PROCESS_0)
return 2 * vpage + 2;
if (process == PROCESS_1)
return 2 * vpage + 1;
}
return -1;
}
void main_master(void)
{
init();
IRQVECTOR[16] = switch_to_process0;
IRQVECTOR[17] = switch_to_process1;
}
int main(int argc, char **argv)
{
main_master();
_mask(0x1001); // Basculer mode utilisateur
main_user();
}
#if !defined(PROCESS) #if !defined(MI_KERNEL)
#define PROCESS #define MI_KERNEL
#define PROCESS_1 1
#define PROCESS_0 0
#define N 127
#define VM_SIZE 160000 * 8
#define VM_SIZE 16000000
#define MMU_FAULT_ADDR_LO 0xCC #define MMU_FAULT_ADDR_LO 0xCC
#define MMU_FAULT_ADDR_HI 0xCD #define MMU_FAULT_ADDR_HI 0xCD
#define TLB_ADD_ENTRY 0xCE
#define PROCESS_1 1
#define PROCESS_0 0
struct tlb_entry_s struct tlb_entry_s
{ {
...@@ -27,8 +25,12 @@ union tlb_entry_u ...@@ -27,8 +25,12 @@ union tlb_entry_u
typedef union tlb_entry_u tlb_entry_t; typedef union tlb_entry_u tlb_entry_t;
int ppage_of_vpage(int process, unsigned vpage);
void mmu_handler(); void mmu_handler();
#endif // PROCESS void switch_to_process0(void);
void switch_to_process1(void);
void main_master(void);
#endif // MI_KERNEL
#if !defined(MI_SYSCALL)
#define MI_SYSCALL
#define SYSCALL_SWTCH_0 16
#define SYSCALL_SWTCH_1 17
#define N 127
void init(void);
#endif // MI_SYSCALL
#include <stdio.h>
#include <string.h>
#include "mi_user.h"
#include "mi_syscall.h"
#include "hardware.h"
int sum(void *ptr)
{
int i;
int sum = 0;
for (i = 0; i < PAGE_SIZE * N / 2; i++)
sum += ((char *)ptr)[i];
return sum;
}
void main_user(void)
{
void *ptr;
int res;
ptr = virtual_memory;
_int(SYSCALL_SWTCH_0);
memset(ptr, 1, PAGE_SIZE * N / 2);
_int(SYSCALL_SWTCH_1);
memset(ptr, 3, PAGE_SIZE * N / 2);
_int(SYSCALL_SWTCH_0);
res = sum(ptr);
printf("Resultat du processus 0 : %d\n", res);
_int(SYSCALL_SWTCH_1);
res = sum(ptr);
printf("Resultat processus 1 : %d\n", res);
}
\ No newline at end of file
#if !defined(MI_USER)
#define MI_USER
#define PAGE_SIZE 4000
int ppage_of_vpage(int process, unsigned vpage);
int sum(void *ptr);
void main_user(void);
#endif // MI_USER
#include <stdlib.h>
#include <stdio.h>
#include "hardware.h"
#include "process.h"
int current_process = NULL;
int ppage_of_vpage(int process, unsigned vpage)
{
if (vpage < N)
{
if (process == PROCESS_0)
return 2 * vpage + 2;
if (process == PROCESS_1)
return 2 * vpage + 1;
}
return -1;
}
void mmu_handler()
{
tlb_entry_t tlb;
unsigned int vaddr = ((long int)_in(MMU_FAULT_ADDR_HI) << 32) | (_in(MMU_FAULT_ADDR_LO) & 0xFFFFFFFF);
unsigned int vpage = (vaddr >> 12) & 0xFFF;
unsigned int ppage = ppage_of_vpage(current_process, vpage);
if (vaddr < virtual_memory || vaddr > virtual_memory + VM_SIZE || vpage == -1)
{
fprintf(stderr, "Echec");
exit(EXIT_FAILURE);
}
tlb.s.tlb_vpage = vpage;
tlb.s.tlb_ppage = ppage;
tlb.s.tlb_rwx = 7;
tlb.s.tlb_used = 1;
_out(TLB_ADD_ENTRY, tlb.i);
}
No preview for this file type
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment