X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fthreads%2Fintr-stubs.pl;h=75cde7b6bb8cdf2629357beef89886a00d6eb1ea;hb=c9613f4d1fd208911409de6f82b430e5f9a595ae;hp=ea20e9668ede5de1669138957c5e205079c6e3f4;hpb=1824e4d39b4f042474d29ac91ee59b326ab00da1;p=pintos-anon diff --git a/src/threads/intr-stubs.pl b/src/threads/intr-stubs.pl index ea20e96..75cde7b 100755 --- a/src/threads/intr-stubs.pl +++ b/src/threads/intr-stubs.pl @@ -1,9 +1,11 @@ #! /usr/bin/perl print <<'EOF'; -#include "mmu.h" +#include "threads/loader.h" - .globl intr_stubs + .data + .intel_syntax noprefix +.globl intr_stubs intr_stubs: EOF @@ -11,46 +13,54 @@ for $i (0...255) { $x = sprintf ("%02x", $i); print "\t.long intr${x}_stub\n"; } -print "\n"; + +print <<'EOF'; + + .text +EOF for $i (0...255) { $x = sprintf ("%02x", $i); - print "\t.globl intr${x}_stub\n"; + print ".globl intr${x}_stub\n"; print "intr${x}_stub:\n"; - print "\tpushl \$0\n" + print "\tpush 0\n" if ($i != 8 && $i != 10 && $i != 11 && $i != 13 && $i != 14 && $i != 17); - print "\tpushl \$0x$x\n"; + print "\tpush 0x$x\n"; print "\tjmp intr_entry\n"; } print <<'EOF'; intr_entry: - # FIXME: build a fake stack frame to improve backtraces. # Save caller's registers. - pushl %ds - pushl %es - pushal + push ds + push es + push fs + push gs + pusha # Set up kernel environment. cld - movl $SEL_KDSEG, %eax - movl %eax, %ds - movl %eax, %es + mov eax, SEL_KDSEG + mov ds, eax + mov es, eax - # Call handler. - pushl %esp - .globl intr_handler + # Call interrupt handler. + push esp +.globl intr_handler call intr_handler + add esp, 4 - .globl intr_exit +.globl intr_exit intr_exit: - addl $4, %esp - # Restore caller's registers. - popal - popl %es - popl %ds - addl $8, %esp + popa + pop gs + pop fs + pop es + pop ds + add esp, 8 + + # Return to caller. iret EOF