FreeBSD 6.3の割り込み

どんな風になってるかちょっと読んでみた。

ふつーの割り込みのばやい

apic_vector.sで定義されてる、ISR_VEC()が各割り込み処理の開始ポイントになってるはず。
まず、PUSH_FRAMEで

#define PUSH_FRAME							\
	pushl	$0 ;		/* dummy error code */			\
	pushl	$0 ;		/* dummy trap type */			\
	pushal ;		/* 8 ints */				\
	pushl	%ds ;		/* save data and extra segments ... */	\
	pushl	%es ;							\
	pushl	%fs

のように必要なレジスタを全部スタックに積んじゃう。

	call	lapic_handle_intr ;

でハンドラを呼んで、

	jmp	doreti ;

でdoretiに飛ぶ。

doretiでは

	call	ast

でast()を呼んでから、

	.globl	doreti_popl_fs
doreti_popl_fs:
	popl	%fs
	.globl	doreti_popl_es
doreti_popl_es:
	popl	%es
	.globl	doreti_popl_ds
doreti_popl_ds:
	popl	%ds
	popal
	addl	$8,%esp
	.globl	doreti_iret
doreti_iret:
	iret

でスタックにつんどいたレジスタを全て戻してreturnする。

となってた。