/* * Initialize handlers for processor traps. */ void Init_Traps(void) { Install_Interrupt_Handler(12, &GPF_Handler); /* stack exception */ Install_Interrupt_Handler(13, &GPF_Handler); /* general protection fault */ Install_Interrupt_Handler(SYSCALL_INT, &Syscall_Handler); }
void Initialize_RTC(void) { Install_Interrupt_Handler(IRQ8, RTC_Handler); // Install the handler Disable_Interrupts(); outb(0x70, 0x8B); // Select register B and disable NMI char prev = inb(0x71); // Read the current value of register B outb(0x70, 0x8B); outb(0x71, prev | 0x40);// Write the prev value, turning on bit 6 or register B Enable_Interrupts(); kprintf("Real Time Clock Initialized\n"); }
static int Spawn_Program(char *exeFileData, struct Exe_Format *exeFormat) { struct Segment_Descriptor* desc; unsigned long virtSize; unsigned short codeSelector, dataSelector; int i; ulong_t maxva = 0; /* Find maximum virtual address */ for (i = 0; i < exeFormat->numSegments; ++i) { struct Exe_Segment *segment = &exeFormat->segmentList[i]; ulong_t topva = segment->startAddress + segment->sizeInMemory; if (topva > maxva) maxva = topva; } /* setup some memory space for the program */ virtSize = Round_Up_To_Page(maxva) + 4096; /* leave some slack for stack */ virtSpace = Malloc(virtSize); memset((char *) virtSpace, '\0', virtSize); /* Load segment data into memory */ for (i = 0; i < exeFormat->numSegments; ++i) { struct Exe_Segment *segment = &exeFormat->segmentList[i]; memcpy(virtSpace + segment->startAddress, exeFileData + segment->offsetInFile, segment->lengthInFile); } /* allocate and init descriptors and selectors for code and data */ // Kernel code segment. desc = Allocate_Segment_Descriptor(); Init_Code_Segment_Descriptor( desc, (unsigned long)virtSpace, // base address (virtSize/PAGE_SIZE)+10, // num pages 0 // privilege level (0 == kernel) ); codeSelector = Selector( 0, true, Get_Descriptor_Index( desc ) ); // Kernel data segment. desc = Allocate_Segment_Descriptor(); Init_Data_Segment_Descriptor( desc, (unsigned long)virtSpace, // base address (virtSize/PAGE_SIZE)+10, // num pages 0 // privilege level (0 == kernel) ); dataSelector = Selector( 0, true, Get_Descriptor_Index( desc ) ); Install_Interrupt_Handler( 0x90, &Printrap_Handler ); if (lprogdebug) { Print("Spawn_Program(): all structures are set up\n"); Print(" virtSpace = %x\n", (unsigned int) virtSpace); Print(" virtSize = %x\n", (unsigned int) virtSize); Print(" codeSelector = %x\n", codeSelector); Print(" dataSelector = %x\n", dataSelector); Print("Now calling Trampoline()... \n"); } Trampoline(codeSelector, dataSelector, exeFormat->entryAddr); return 0; }