From 4cda542d863839c5b0e026ccee297ca5ff3dd9cd Mon Sep 17 00:00:00 2001 From: Miguel Date: Sun, 9 Sep 2018 17:28:59 +0200 Subject: switched to apic/ioapic finally --- asm/asm_int.h | 4 +++ asm/asm_int.s | 59 ++++++++++++++++++++---------------- asm/asm_mp.asm | 93 --------------------------------------------------------- asm/asm_mp.h | 11 ------- asm/asm_smp.asm | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ asm/asm_smp.h | 11 +++++++ 6 files changed, 142 insertions(+), 129 deletions(-) delete mode 100644 asm/asm_mp.asm delete mode 100644 asm/asm_mp.h create mode 100644 asm/asm_smp.asm create mode 100644 asm/asm_smp.h (limited to 'asm') diff --git a/asm/asm_int.h b/asm/asm_int.h index 5f32777..2940ab4 100644 --- a/asm/asm_int.h +++ b/asm/asm_int.h @@ -25,6 +25,10 @@ void int15(); void int128(); // syscalls void int129(); // scheduler +void int140(); // scheduler +void int144(); // scheduler +void int145(); // scheduler +void int146(); // scheduler void int200(); // apic timer void int170(); // smp scheduler void int255(); // unhandled diff --git a/asm/asm_int.s b/asm/asm_int.s index 70993b4..ec81885 100644 --- a/asm/asm_int.s +++ b/asm/asm_int.s @@ -19,6 +19,10 @@ .global int128 .global int129 .global int200 +.global int140 +.global int144 +.global int145 +.global int146 .global int170 .global int255 @@ -137,31 +141,6 @@ jmp . .endm -int0: intx ack1 $0 interrupt_handler -int1: intx ack1 $1 interrupt_handler -int2: intx ack1 $2 interrupt_handler -int3: intx ack1 $3 interrupt_handler -int4: intx ack1 $4 interrupt_handler -int5: intx ack1 $5 interrupt_handler -int6: intx ack1 $6 interrupt_handler -int7: intx ack1 $7 interrupt_handler - -int8: intx ack2 $8 interrupt_handler -int9: intx ack2 $9 interrupt_handler -int10: intx ack2 $10 interrupt_handler -int11: intx ack2 $11 interrupt_handler -int12: intx ack2 $12 interrupt_handler -int13: intx ack2 $13 interrupt_handler -int14: intx ack2 $14 interrupt_handler -int15: intx ack2 $15 interrupt_handler - -int128: intx ack0 $128 interrupt_handler -int129: intx ack0 $129 interrupt_handler - -int255: intx ack0 $255 interrupt_handler -int200: intx ack0 $200 interrupt_handler -int170: intx ack0 $170 interrupt_handler - exc0: excx $0 exception_handle exc1: excx $1 exception_handle exc2: excx $2 exception_handle @@ -181,3 +160,33 @@ exc15: excx $15 exception_handle exc16: excx $16 exception_handle exc17: excx $17 exception_handle exc18: excx $18 exception_handle + +int0: intx ack0 $0 interrupt_handler +int1: intx ack0 $1 interrupt_handler +int2: intx ack0 $2 interrupt_handler +int3: intx ack0 $3 interrupt_handler +int4: intx ack0 $4 interrupt_handler +int5: intx ack0 $5 interrupt_handler +int6: intx ack0 $6 interrupt_handler +int7: intx ack0 $7 interrupt_handler +int8: intx ack0 $8 interrupt_handler +int9: intx ack0 $9 interrupt_handler +int10: intx ack0 $10 interrupt_handler +int11: intx ack0 $11 interrupt_handler +int12: intx ack0 $12 interrupt_handler +int13: intx ack0 $13 interrupt_handler +int14: intx ack0 $14 interrupt_handler +int15: intx ack0 $15 interrupt_handler + +int128: intx ack0 $128 interrupt_handler +int129: intx ack0 $129 interrupt_handler + +int140: intx ack0 $140 interrupt_handler +int144: intx ack0 $144 interrupt_handler +int145: intx ack0 $145 interrupt_handler +int146: intx ack0 $146 interrupt_handler + +int255: intx ack0 $255 interrupt_handler +int200: intx ack0 $200 interrupt_handler +int170: intx ack0 $170 interrupt_handler + diff --git a/asm/asm_mp.asm b/asm/asm_mp.asm deleted file mode 100644 index 18b9d7e..0000000 --- a/asm/asm_mp.asm +++ /dev/null @@ -1,93 +0,0 @@ -global smp_start -extern smp_main -global asm_smp_unlock - -; master boot record for application processors -smp_start: -[bits 16] - - cli ;switch off interrupts! - lgdt [gdt_descriptor] ;load descriptor table! - - ;switch on 32-bit protected mode - mov eax, cr0 - or eax,0x1 - mov cr0, eax - - jmp 0x8:init_pm - -[bits 32] - - -LLOCK: dd 1 - -asm_smp_unlock: - mov eax, 0x0 - mov [LLOCK], eax - ret - -init_pm: - - mov ax, 0x10 - mov ds, ax - mov ss, ax - mov es, ax - mov fs, ax - mov gs, ax - - mov ebp, 0x7000 ;temporary stack - mov esp, ebp - - call boot_32_pm ;continue booting in 32-bit protected mode - -boot_32_pm: - - mov eax,1 - xchg eax, [LLOCK] - cmp eax,1 - je boot_32_pm - - mov ebp, 0x7000 - mov esp, ebp - - and esp,-16 ; padding to align stack on 16byte boundary before CALL - call smp_main - - jmp $ ; should never be reached - -gdt_start: - -gdt_null: ;null descriptor (2 x 4 bytes) - dd 0x0 - dd 0x0 - -gdt_code: - ; flags: - ; present: 1 / privilege: 00 / type: 1 - ; code: 1 / conforming: 0 / readable: 1 / accessed: 0 - ; granularity: 1 / 16-bit default: 1 / 64-bit seg: 0 / AVL: 0 - dw 0xffff ;limit - dw 0x0 ;base - db 0x0 ;base - db 10011010b ;flags - db 11001111b ;flags & seg.limit - db 0x0 ;base - -gdt_data: - ; flags: - ; code: 0 / expand down: 0 / writable: 1 / accessed: 0 - dw 0xffff - dw 0x0 - db 0x0 - db 10010010b - db 11001111b - db 0x0 - -gdt_end: - -gdt_descriptor: - dw gdt_end-gdt_start-1 - dd gdt_start - -;CODE_SEG equ gdt_code - gdt_start -;DATA_SEG equ gdt_data - gdt_start diff --git a/asm/asm_mp.h b/asm/asm_mp.h deleted file mode 100644 index f36f4f7..0000000 --- a/asm/asm_mp.h +++ /dev/null @@ -1,11 +0,0 @@ -/** - * @file - * Multiprocessing - * =============== - * - * smp_start should be entered by the application processors and calls - * the C-function: smp_main() in turn. - * */ - -void smp_start(); -void asm_smp_unlock(); diff --git a/asm/asm_smp.asm b/asm/asm_smp.asm new file mode 100644 index 0000000..18b9d7e --- /dev/null +++ b/asm/asm_smp.asm @@ -0,0 +1,93 @@ +global smp_start +extern smp_main +global asm_smp_unlock + +; master boot record for application processors +smp_start: +[bits 16] + + cli ;switch off interrupts! + lgdt [gdt_descriptor] ;load descriptor table! + + ;switch on 32-bit protected mode + mov eax, cr0 + or eax,0x1 + mov cr0, eax + + jmp 0x8:init_pm + +[bits 32] + + +LLOCK: dd 1 + +asm_smp_unlock: + mov eax, 0x0 + mov [LLOCK], eax + ret + +init_pm: + + mov ax, 0x10 + mov ds, ax + mov ss, ax + mov es, ax + mov fs, ax + mov gs, ax + + mov ebp, 0x7000 ;temporary stack + mov esp, ebp + + call boot_32_pm ;continue booting in 32-bit protected mode + +boot_32_pm: + + mov eax,1 + xchg eax, [LLOCK] + cmp eax,1 + je boot_32_pm + + mov ebp, 0x7000 + mov esp, ebp + + and esp,-16 ; padding to align stack on 16byte boundary before CALL + call smp_main + + jmp $ ; should never be reached + +gdt_start: + +gdt_null: ;null descriptor (2 x 4 bytes) + dd 0x0 + dd 0x0 + +gdt_code: + ; flags: + ; present: 1 / privilege: 00 / type: 1 + ; code: 1 / conforming: 0 / readable: 1 / accessed: 0 + ; granularity: 1 / 16-bit default: 1 / 64-bit seg: 0 / AVL: 0 + dw 0xffff ;limit + dw 0x0 ;base + db 0x0 ;base + db 10011010b ;flags + db 11001111b ;flags & seg.limit + db 0x0 ;base + +gdt_data: + ; flags: + ; code: 0 / expand down: 0 / writable: 1 / accessed: 0 + dw 0xffff + dw 0x0 + db 0x0 + db 10010010b + db 11001111b + db 0x0 + +gdt_end: + +gdt_descriptor: + dw gdt_end-gdt_start-1 + dd gdt_start + +;CODE_SEG equ gdt_code - gdt_start +;DATA_SEG equ gdt_data - gdt_start diff --git a/asm/asm_smp.h b/asm/asm_smp.h new file mode 100644 index 0000000..f36f4f7 --- /dev/null +++ b/asm/asm_smp.h @@ -0,0 +1,11 @@ +/** + * @file + * Multiprocessing + * =============== + * + * smp_start should be entered by the application processors and calls + * the C-function: smp_main() in turn. + * */ + +void smp_start(); +void asm_smp_unlock(); -- cgit v1.2.3