please help

Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
Post Reply
NULL

please help

Post by NULL »

i have just finished coding my idt, but it crashes out saying

load_seg_reg: SS: new_value == 0

i cannot seem to see what is wrong and would cause that error please let me
know if you spot anything stupid that i have done thank you

here is a listing of my idt.c and idt.h file

IDT.C FILE

//idt.c

#include "idt.h"
#include "asm.h"
#include "types.h"
#include "defines.h"
#include "x86.h"

static idt_descriptor interrupts[NUM_INTS];

void init_idt() {

int i = 0;

//fill in with blank idts for now
for(i=0;i<NUM_INTS;i++) {
add_interrupt(i, (uint32)&null_int, (uint16)code_desc,
(IDT_INT|IDT_ZERO_BIT|IDT_DPL_0|IDT_PRESENT));
}

byte idt_add[6];

unsigned int size = sizeof(interrupts)-1; //should this be -1 as
well???????

idt_add[0] = size & 255;
idt_add[1] = (size >> 8) & 255;

unsigned int idt_base = (unsigned int)&interrupts;

idt_add[2] = idt_base & 255;
idt_add[3] = (idt_base >> 8) & 255;
idt_add[4] = (idt_base >> 16) & 255;
idt_add[5] = (idt_base >> 24) & 255;

__asm__ __volatile__ ("lidt %0": :"g"(idt_add[0]));


}

void add_interrupt(int idt_number, uint32 offset, uint16 selector, byte
flags) {

interrupts[idt_number].offset_start = offset & 0xFFFF;
interrupts[idt_number].offset_end = (offset >> 16) & 0xFFFF;
interrupts[idt_number].segment_selector = selector;
interrupts[idt_number].intel_reserved = IDT_RESERVED;
interrupts[idt_number].flags_type = flags;
}

//for task gate here

void add_task_interrupt(int idt_number, uint16 selector, byte flags) {

interrupts[idt_number].offset_start = 0x0;
interrupts[idt_number].offset_end = 0x0;
interrupts[idt_number].segment_selector = selector;
interrupts[idt_number].intel_reserved = IDT_RESERVED;
interrupts[idt_number].flags_type = flags;
}

void init_pic() {
//master ports 0x20, 0x21
//slave ports 0xa0, 0xa1

//4 ICW words for init

//port, command //SET AUTO EOI ???????????????
//ICW1
outportb(0x20, 0x11); //init master edge triggered, cascaded, ICW4 required
outportb(0xa0, 0x11); //slave
//ICW2
//remaps pic 0 to whatever u put into high nibble+1 of reqister
//remap irq 0 to > 36;
outportb(0x21, 0x24); //irq 0 = 36
outportb(0xa1, 0x2C); //irq 8 = 44
//ICW3
outportb(0x21, 0x4); // connect slave to master
outportb(0xa1, 0x2); //set slave to communicate via irq 2 of masters
//ICW4
outportb(0x21, 0x1); //operate master in 8086/88 mode SET AUTO EOI?
outportb(0xa1, 0x1); //operate slave in 8086/88 mode SET AUTO EOI?

mask_all_irqs();
}

void mask_irq(byte irq_number) {

irq_number = irq_number|(1<<irq_number); //push 1 along as many bits as
irq_number use OR
if(irq_number<8) { //if 0-7 irq
outportb(0x21, irq_number&0xFF); //use FF to allow just irq to go thourgh
}
else {
outportb(0xa1, irq_number>>8); //slave
}
}


void unmask_irq(byte irq_number) {

irq_number = irq_number&(1<<irq_number); //push 1 along as many bits as
irq_number AND
if(irq_number<8) {
outportb(0x21, irq_number&0xFF);
}
else {
outportb(0xa1, irq_number>>8);
}
}

void mask_all_irqs() {
//send OCW with all bits sent to mask all
outportb(0x21, 0xFF); //master all masked
outportb(0xa1, 0xFF); //slave
}

void unmask_all_irqs() {
//clear all bits
outportb(0x21, 0x0);//master
outportb(0xa1, 0x0);//slave
}

///HANDLERS

void null_int() {
iret();
print("IRET", 0);
}


//////////////////IDT.H

//idt.h

#ifndef _IDT_H_

#define _IDT_H_

#include "defines.h"
#include "types.h"



void init_idt();
void add_interrupt(int idt_number, uint32 offset, uint16 selector, byte
flags);
void null_int();
void init_pic();
void mask_irq(byte irq_number);
void unmask_irq(byte irq_number);
void mask_all_irqs();
void unmask_all_irqs();


#define NUM_INTS 256


//there are 3 types of idt entries
//trap gate, interrupt gate, task gate

#define IDT_RESERVED 0x0//0000 0000 high byte i always 0 for int/trap gate,
bottom is reserved so set all to 0

//type flags =
// D 1 1 0, (high res) 000 <- interrupt gate D = 1 = 32 bit, D = 0 = 16bit
// D 1 1 1, (high res) 000 <- trap gate
//set D = 1 we want 32bits only

#define IDT_TRAP 0xE //(1)110
#define IDT_INT 0xF //(1)111
#define IDT_TASK 0x5 // 00 101

#define IDT_ZERO_BIT 0x0 // 00000

#define IDT_DPL_0 0x0 //0
#define IDT_DPL_1 0x20 //01 00000
#define IDT_DPL_2 0x40 //10 00000
#define IDT_DPL_3 0x60 //11 00000

#define IDT_PRESENT 0x80 //1 00 00000
#define IDT_NPRESENT 0x0 //0 00 00000


typedef struct {

uint16 offset_start;
uint16 segment_selector;
byte intel_reserved;
byte flags_type;
uint16 offset_end;
}idt_descriptor;

#endif


END OF IDT.H FILE
User avatar
Pype.Clicker
Member
Member
Posts: 5964
Joined: Wed Oct 18, 2006 2:31 am
Location: In a galaxy, far, far away
Contact:

Re:please help

Post by Pype.Clicker »

imho, this is more likely to be a low-level initialization problem ... did you set up a value for SS and ESP since you switched from PMODE ? can you pinpoint the place where the problem occur (i.e. resolve the EIP value BOCHS gives you ... )
distantvoices
Member
Member
Posts: 1600
Joined: Wed Oct 18, 2006 11:59 am
Location: Vienna/Austria
Contact:

Re:please help

Post by distantvoices »

maybe bochsdebug helps? have bochs write the output the debugger spills out write to a file and check the very last instructions bwefore the whole thing has crapped out.
... the osdever formerly known as beyond infinity ...
BlueillusionOS iso image
Post Reply