Li-Ta Lo <ollie(a)lanl.gov> writes:
> Eric,
>
> Why there are two ways for interrupt handling in c_start.S
There are two ways for hardware exception handling. Interrupts
are not handled. And that is because on x86 exception handlers
don't always give you an error code.
> vec9:
> pushl $0 /* error code */
> pushl $9 /* vector */
> jmp int_hand
>
>
> vec10:
> /* error code */
> pushl $10 /* vector */
> jmp int_hand
> .word 0x9090
>
> Vector 9 push the error code and vector but vector 10 only push the
> vector number.
>
> BTW, are those handler actually used ? The idt is uninited.
This hunk below initializes it. It seems to work out better to initialize the idt
with code instead of data.
/* Initialize the Interrupt Descriptor table */
leal _idt, %edi
leal vec0, %ebx
movl $(0x10 << 16), %eax /* cs selector */
1: movw %bx, %ax
movl %ebx, %edx
movw $0x8E00, %dx /* Interrupt gate - dpl=0, present */
movl %eax, 0(%edi)
movl %edx, 4(%edi)
addl $6, %ebx
addl $8, %edi
cmpl $_idt_end, %edi
jne 1b
/* Load the Interrupt descriptor table */
lidt idtarg
Eric