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
please help
- Pype.Clicker
- Member

- Posts: 5964
- Joined: Wed Oct 18, 2006 2:31 am
- Location: In a galaxy, far, far away
- Contact:
Re:please help
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

- Posts: 1600
- Joined: Wed Oct 18, 2006 11:59 am
- Location: Vienna/Austria
- Contact:
Re:please help
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
BlueillusionOS iso image