All pastes #24552 Raw Edit

Someone

public text v1 · immutable
#24552 ·published 2005-10-04 02:46 UTC
rendered paste body
void dummy_int_handler();
void dummy_err_handler();
void thread_int_handler();
void start();
void cont();

struct INTERRUPT {
	unsigned short offsetLow;
 	unsigned short segmentSelector;
	unsigned reserved : 5;
	unsigned signature : 8;
	unsigned dpl : 2;
	unsigned present : 1;
	unsigned short offsetHigh;
};

struct INTERRUPT idt[256];
void* stack;
void* stack2;

void func() {
	while (1) {
		*(char*)(0xB8000) = 'S';
	}
}

void kmain() {
	short idtr[3] = { 256 * 8, (int) idt & 0xffff, (int) idt >> 16 };
	
	struct INTERRUPT thread = {
		(int) thread_int_handler & 0xffff,
		1 << 3,
		0,
		0x70,
		0,
		1,
		(int) thread_int_handler >> 16
	};
	
	struct INTERRUPT dummy = {
		(int) dummy_int_handler & 0xffff,
		1 << 3,
		0,
		0x70,
		0,
		1,
		(int) dummy_int_handler >> 16
	};
	
	struct INTERRUPT err = {
		(int) dummy_err_handler & 0xffff,
		1 << 3,
		0,
		0x70,
		0,
		1,
		(int) dummy_err_handler >> 16
	};
	
	idt[0] = dummy;
	idt[1] = dummy;
	idt[2] = dummy;
	idt[3] = dummy;
	idt[4] = dummy;
	idt[5] = dummy;
	idt[6] = dummy;
	idt[7] = dummy;
	idt[8] = thread;
	idt[9] = dummy;
	idt[10] = err;
	idt[11] = err;
	idt[12] = err;
	idt[13] = err;
	idt[14] = err;
	idt[15] = dummy;
	idt[16] = dummy;
	idt[17] = err;
	
	int i;
	for (i = 18; i < 256; i++) idt[i] = dummy;
	asm("lidt (%0)" : : "a" (idtr));
	asm("outb %b0, %w1" : : "a" (0xFE), "Nd" (21));
	
	stack2 = 0x200000;
	
	start();
	while (1) {
		*(char*)(0xB8000) = 'T';
		cont();
	}
}