x86 TSSを使わないコンテキスト切り替えについて

なんかTSSを使ったコンテキスト切り替えが思うように実装出来なかったので、ソフトウェアで実装してみた。

私の常識はMIPSの常識なので、当然汎用レジスタをPCBに保存して・・・とか思ってたら、

Intel x86ではこのタイミングで切り替えることは不要です。必要な情報はすでにスタック上に退避されています。

ええっ・・・そうなのか。。

壊しちゃいけないのが ebx, esi, edi, ebpとセグメントレジスタ
という事らしい。
で、BSDのコードを参考にしてこんな感じに作ってみた:

	movl	4(%esp),%ecx

	movl	0(%esp),%eax
	movl	%eax,THREAD_MD_EIP(%ecx)
	movl	%ebx,THREAD_MD_EBX(%ecx)
	movl    %esp,THREAD_MD_ESP(%ecx)
	movl	%ebp,THREAD_MD_EBP(%ecx)
	movl	%esi,THREAD_MD_ESI(%ecx)
	movl	%edi,THREAD_MD_EDI(%ecx)
	pushfl
	popl	THREAD_MD_EFLAGS(%edx)

	movl	8(%esp),%ecx
	movl	THREAD_MD_EBX(%ecx),%ebx
	movl	THREAD_MD_ESP(%ecx),%esp
	movl	THREAD_MD_EBP(%ecx),%ebp
	movl	THREAD_MD_ESP(%ecx),%esp
	movl	THREAD_MD_ESI(%ecx),%esi
	movl	THREAD_MD_EDI(%ecx),%edi
	movl	THREAD_MD_EIP(%ecx),%eax
	pushl	THREAD_MD_EFLAGS(%ecx)
	popfl
	movl	THREAD_MD_EIP(%ecx),%eax
	movl	%eax,(%esp)
	ret

とりあえず、セグメントレジスタとかIOPLとかは考えてない。
カーネル内スレッド専用。