#include "../h/initProc.h"
#include "../h/vmSupport.h"
#include "../h/sysSupport.h"
support_t userSupportStructure[UPROCMAX];
state_t userStateStructure[UPROCMAX];
int supportDeviceSemaphore[3][UPROCMAX]; // 3 device semaphores for printer, terminal receiver and terminal transmitter
int flashSemaphores[UPROCMAX]; // Semaphores to represent the flash devices
extern swap_t swapPoolTable[POOLSIZE];
extern int swapPoolSemaphore;
extern void Support_Pager();
extern void GeneralException_Handler();
int master_sem; // master semaphore
/* Function to initialize the processes */
void test(){
initSwapStructs();
initSemaphores();
// Initialize and launch 8 u-procs
for (int i=0; i < UPROCMAX; i++) {
initProcess(i);
//SYSCALL(PASSEREN, (int) &master_sem, 0, 0);
/*
This causes the test process to remain blocked until all
u-procs have finished executing because the P operation forces
mutually exclusive access by keeping the master_sem negative until
all executions are complete.
*/
}
for (int i=0; i < UPROCMAX; i++) { //I changed code here (test() should be blocked after all 8 u-procs have been launched
SYSCALL(PASSEREN, (int) &master_sem, 0, 0);
}
SYSCALL(TERMINATE, 0, 0, 0);
}
void initSemaphores()
{
master_sem = 0;
for (int i=0; i < UPROCMAX; i++) {
flashSemaphores[i] = 1;
}
for (int i=0; i < 3; i++) {
for (int j=0; j < UPROCMAX; j++){
supportDeviceSemaphore[i][j] = 1;
}
}
}
void initProcess(int id)
{
// id is the u-proc number being launches
userStateStructure[id].pc_epc = 0x800000B0; // address of the start of the .text section
userStateStructure[id].reg_t9 = 0x800000B0;
userStateStructure[id].reg_sp = 0xC0000000;
userStateStructure[id].status = IMON | IEPON | USERPON | TEBITON; // user mode, interrupts enabled, PLT enabled
userStateStructure[id].entry_hi = (id + 1) << 6;
// Initialize the u-proc's support structure
userSupportStructure[id].sup_asid = id + 1;
userSupportStructure[id].sup_exceptContext[0].pc = (memaddr) Support_Pager;
userSupportStructure[id].sup_exceptContext[1].pc = (memaddr) GeneralException_Handler;
userSupportStructure[id].sup_exceptContext[0].status = IMON | IEPON | TEBITON; // kernel mode, interrupts enabled, PLT enabled
userSupportStructure[id].sup_exceptContext[1].status = IMON | IEPON | TEBITON; // kernel mode, interrupts enabled, PLT enabled
memaddr ramtopValue;
RAMTOP(ramtopValue); // assign current ramtop value
userSupportStructure[id].sup_exceptContext[0].stackPtr = ramtopValue - (id + 1) * PAGESIZE * 2;
userSupportStructure[id].sup_exceptContext[1].stackPtr = ramtopValue - (id + 1) * PAGESIZE * 2 + PAGESIZE;
// Initialize the u-proc's page table
for (int i = 0; i < MAXPAGES; i++) {
if (i == 31) {
// Stack page
userSupportStructure[id].sup_privatePgTbl[i].pte_entryHI = 0xBFFFF << 12; // Each page is 4KB
} else {
userSupportStructure[id].sup_privatePgTbl[i].pte_entryHI = 0x80000000 + (i << 12);
}
// Find ASID number corresponding to the page number in tne entryHI field
SET_ASID(userSupportStructure[id].sup_privatePgTbl[i].pte_entryHI, id + 1);
// Page is write enabled
userSupportStructure[id].sup_privatePgTbl[i].pte_entryLO = 0x00000400;
}
// Launch/Start u-proc
int launchStatus = SYSCALL(CREATEPROCESS, (int) &userStateStructure[id], (int) &userSupportStructure[id], 0);
if (launchStatus == -1) {
SYSCALL(TERMINATE, 0, 0, 0);
}
}