/* 例外関係 */

#include "bootpack.h"
#include <stdio.h>

int *except_fpu(int *esp)
{
	struct task *task = task_now();

	cli();
	clts();
	if(tasks->tfpu != task) {
		if(tasks->tfpu)
			fnsave(tasks->tfpu->fpu);
		frstor(task->fpu);
		tasks->tfpu = task;
	}
	sti();
	return 0;
}

int *except_stack(int *esp)
{
	struct task *task = task_now();
	struct console *cons = task->cons;
	char s[30];

	cons_fonts(cons, "\nint 0x0c:\nこのプログラムは、スタック保護例外により、強制終了されました。\n");
	sprintf(s, "eip = 0x%08x\n", esp[11]);
	cons_fonts(cons, s);
	sprintf(s, "ss  = 0x%08x\n", esp[15]);
	cons_fonts(cons, s);
	sprintf(s, "esp = 0x%08x\n", esp[14]);
	cons_fonts(cons, s);
	return &(task->tss.esp0);
}

int *except_general(int *esp)
{
	struct task *task = task_now();
	struct console *cons = task->cons;
	char s[30];

	cons_fonts(cons, "\nint 0x0d:\nこのプログラムは、一般保護例外により、強制終了されました。\n");
	sprintf(s, "eip = 0x%08x\n", esp[11]);
	cons_fonts(cons, s);
	sprintf(s, "ss  = 0x%08x\n", esp[15]);
	cons_fonts(cons, s);
	sprintf(s, "esp = 0x%08x", esp[14]);
	cons_fonts(cons, s);
	return &(task->tss.esp0);
}

void except_dfint(int *esp)
{
	/* PIC0からの不完全割り込み対策 */
	outb(PIC0_OCW2, 0x67);	/* IRQ-07受付完了をPICに通知 */
	return;
}
