OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_008 / chnos / intrpt.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/intrpt.c b/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/intrpt.c
new file mode 100644 (file)
index 0000000..aca6dc7
--- /dev/null
@@ -0,0 +1,336 @@
+\r
+#include "core.h"\r
+\r
+void init_pic(void)\r
+{\r
+       /*\r
+       IRR\81F\83C\83\93\83^\83\89\83v\83g\83\8a\83N\83G\83X\83g\83\8c\83W\83X\83\r
+               .IRQ\83s\83\93\82Ì\8fó\91Ô\82ð\95\\82·\81B\83|\81[\83g\82ð\93Ç\82ñ\82¾\82Æ\82«\82É\81AIRR\82É\82È\82é\82©ISR\82É\82È\82é\82©\82Í\81AOCW3\82Å\91I\91ð\82·\82é\81B\r
+               .1\82É\82È\82Á\82Ä\82¢\82é\83r\83b\83g\82Í\81A\8c»\8dÝ\97v\8b\81\82ª\97\88\82Ä\82¢\82é\81i\82à\82µ\82­\82Í\8f\88\97\9d\92\86\82Ì\81j\8a\84\82è\8d\9e\82Ý\81B\r
+       ISR\81F\83C\83\93\83T\81[\83r\83X\83\8c\83W\83X\83\r
+               .\8c»\8dÝ\8f\88\97\9d\92\86\82Ì\8a\84\82è\8d\9e\82Ý\82ª\82Ç\82ê\82Å\82 \82é\82©\82ð\8e¦\82·\81B\83|\81[\83g\82ð\93Ç\82ñ\82¾\82Æ\82«\82É\81AIRR\82É\82È\82é\82©ISR\82É\82È\82é\82©\82Í\81AOCW3\82Å\91I\91ð\82·\82é\81B\r
+               .1\82É\82È\82Á\82Ä\82¢\82é\83r\83b\83g\82Í\81A\8c»\8dÝ\8f\88\97\9d\92\86\82Ì\8a\84\82è\8d\9e\82Ý\81B\8f\88\97\9d\92\86\82Æ\82¢\82¤\82Ì\82Í\81ACPU\82É\91Î\82µ\82ÄINT\96½\97ß\82ð\94­\8ds\82µ\82½\82ª\81AEOI\81i\8a\84\82è\8d\9e\82Ý\8fI\97¹\96½\97ß\81j\82ð\8eó\82¯\8eæ\82Á\82Ä\82¢\82È\82¢\8a\84\82è\8d\9e\82Ý\81B\r
+       IMR\81F\83C\83\93\83^\83\89\83v\83g\83}\83X\83N\83\8c\83W\83X\83\r
+               .\82±\82ê\82ª1\82É\82È\82Á\82Ä\82¢\82é\8a\84\82è\8d\9e\82Ý\82Í\81AIRR\82ª1\82É\82È\82Á\82Ä\82¢\82Ä\82à\81A\94½\89\9e\82µ\82È\82¢\81\r
+       */\r
+\r
+       io_out8(PIC0_IMR, 0xff);        /*\8a\84\82è\8d\9e\82Ý\91S\95\94\96³\8e\8b\81i\83}\83X\83^\81j*/\r
+       io_out8(PIC1_IMR, 0xff);        /*\8a\84\82è\8d\9e\82Ý\91S\95\94\96³\8e\8b\81i\83X\83\8c\81[\83u\81j*/\r
+\r
+       io_out8(PIC0_ICW1, 0x11);       /*\83G\83b\83W\83g\83\8a\83K\83\82\81[\83h\82É\90Ý\92è\81i\83}\83X\83^\81j*/\r
+       io_out8(PIC0_ICW2, 0x20);       /*\8a\84\82è\8d\9e\82Ý\94Ô\8d\86\82ð\81A20~27\82É\90Ý\92è\81B\81i\83}\83X\83^\81j*/\r
+       io_out8(PIC0_ICW3, 1 << 2);     /*00000100 \82Â\82Ü\82è\81A\83X\83\8c\81[\83u\82ÍIRQ2\82É\82Â\82È\82ª\82Á\82Ä\82Ü\82·\82æ\82Æ\82¢\82¤\82±\82Æ\81B*/\r
+       io_out8(PIC0_ICW4, 0x01);       /*\83m\83\93\83o\83b\83t\83@\83\82\81[\83h\81i\83}\83X\83^\81j*/\r
+\r
+       io_out8(PIC1_ICW1, 0x11);       /*\83G\83b\83W\83g\83\8a\83K\83\82\81[\83h\82É\90Ý\92è\81i\83X\83\8c\81[\83u\81j*/\r
+       io_out8(PIC1_ICW2, 0x28);       /*\8a\84\82è\8d\9e\82Ý\94Ô\8d\86\82ð\81A28~2f\82É\90Ý\92è\81B\81i\83X\83\8c\81[\83u\81j*/\r
+       io_out8(PIC1_ICW3, 2);  /*\8e©\95ª\82Í\83}\83X\83^\82ÌIRQ2\94Ô\82É\82Â\82È\82ª\82Á\82Ä\82Ü\82·\82Æ\82¢\82¤\82±\82Æ\81B*/\r
+       io_out8(PIC1_ICW4, 0x01);       /*\83m\83\93\83o\83b\83t\83@\83\82\81[\83h\81i\83X\83\8c\81[\83u\81j*/\r
+\r
+       io_out8(PIC0_IMR, 0xfb);        /*11111011\82Â\82Ü\82è\81AIRQ2\94Ô\81i\83X\83\8c\81[\83u\81j\82¾\82¯\8b\96\89Â\81B\82 \82Æ\82Í\96³\8e\8b\81B\81i\83}\83X\83^\81j*/  \r
+       io_out8(PIC1_IMR, 0xff);        /*11111111\82Â\82Ü\82è\81A\91S\82Ä\96³\8e\8b*/\r
+\r
+       set_gatedesc(system.io.interrupt.idt+0x27, (int)asm_inthandler27, 2 * 8, AR_INTGATE32);\r
+       io_out8(PIC0_IMR, io_in8(PIC0_IMR) & 0x7f);     /*IRQ-07\91Î\8dô*/\r
+\r
+       return;\r
+}\r
+\r
+void inthandler27(int *esp)\r
+{\r
+       io_out8(PIC0_OCW2, 0x67);       /* IRQ-07\8eó\95t\8a®\97¹\82ðPIC\82É\92Ê\92\81B0x60+\94Ô\8d\86\81B*/\r
+       return;\r
+}\r
+\r
+/*CPU Exceptions*/\r
+char *cpu_exceptions[0x20] = {\r
+       "Exception 0x00:\n\rDivided by zero.",\r
+       "Exception 0x01:\n\rReserved.",\r
+       "Exception 0x02:\n\rNonmaskable interrupt.",\r
+       "Exception 0x03:\n\rBreakpoint.",\r
+       "Exception 0x04:\n\rOverflow.",\r
+       "Exception 0x05:\n\rOutside BOUND.",\r
+       "Exception 0x06:\n\rInvalid opcode.",\r
+       "Exception 0x07:\n\rDisable Device.",\r
+       "Exception 0x08:\n\rDouble fault.",\r
+       "Exception 0x09:\n\rCoprocessor Segment Overrun.",\r
+       "Exception 0x0a:\n\rInvalid task status segment.",\r
+       "Exception 0x0b:\n\rSegment absent.",\r
+       "Exception 0x0c:\n\rStack Segment Fault.",\r
+       "Exception 0x0d:\n\rGeneral Protection Exception.",\r
+       "Exception 0x0e:\n\rPage fault.",\r
+       "Exception 0x0f:\n\rReserved.",\r
+       "Exception 0x10:\n\rFloating point error.",\r
+       "Exception 0x11:\n\rAlignment Check.",\r
+       "Exception 0x12:\n\rMachine Check.",\r
+       "Exception 0x13:\n\rSIMD floating-point exception.",\r
+       "Exception 0x14:\n\rReserved.",\r
+       "Exception 0x15:\n\rReserved.",\r
+       "Exception 0x16:\n\rReserved.",\r
+       "Exception 0x17:\n\rReserved.",\r
+       "Exception 0x18:\n\rReserved.",\r
+       "Exception 0x19:\n\rReserved.",\r
+       "Exception 0x1a:\n\rReserved.",\r
+       "Exception 0x1b:\n\rReserved.",\r
+       "Exception 0x1c:\n\rReserved.",\r
+       "Exception 0x1d:\n\rReserved.",\r
+       "Exception 0x1e:\n\rReserved.",\r
+       "Exception 0x1f:\n\rReserved."\r
+};\r
+\r
+char *cpu_exception_infos[16] = {\r
+       "EDI      ",\r
+       "ESI      ",\r
+       "EBP      ",\r
+       "ESP      ",\r
+       "EBX      ",\r
+       "EDX      ",\r
+       "ECX      ",\r
+       "EAX      ",\r
+       "DS       ",\r
+       "ES       ",\r
+       "ERRORCODE",\r
+       "EIP      ",\r
+       "CS       ",\r
+       "EFLAGS   ",\r
+       "APP's ESP",\r
+       "APP's SS "\r
+};\r
+\r
+void cpu_exception_abort(int exception, int *esp)\r
+{\r
+       int i;\r
+       char s[32];\r
+\r
+//     putfonts32_asc(system.data.info.vesa.PhysBasePtr, system.data.info.boot.scrnx, 0, 0, 0xFFFFFF, (const uchar *)cpu_exceptions[exception]);\r
+//     putfonts32_asc(system.data.info.vesa.PhysBasePtr, system.data.info.boot.scrnx, 0, 16, 0xFFFFFF, "***registers info***");\r
+\r
+       sprintf(s, "%s\n\r", (uchar *)cpu_exceptions[exception]);\r
+       send_serial(s);\r
+\r
+//     putfonts32_asc(system.data.info.vesa.PhysBasePtr, system.data.info.boot.scrnx, 0, 32, 0xFFFFFF, "#PUSHAD by _asm_inthandler");\r
+\r
+       send_serial("#PUSHAD by _asm_inthandler\n\r");\r
+\r
+       for(i = 0; i <= 7; i++){\r
+//             sprintf(s, "%s:0x%08X", cpu_exception_infos[i], esp[i]);\r
+//             putfonts32_asc(system.data.info.vesa.PhysBasePtr, system.data.info.boot.scrnx, 0, 16 * (i + 3), 0xFFFFFF, s);\r
+\r
+               sprintf(s, "%s:0x%08X\n\r", cpu_exception_infos[i], esp[i]);\r
+               send_serial(s);\r
+       }\r
+\r
+//     putfonts32_asc(system.data.info.vesa.PhysBasePtr, system.data.info.boot.scrnx, 0, 176, 0xFFFFFF, "#PUSH by _asm_inthandler");\r
+       send_serial("#PUSH by _asm_inthandler\n\r");\r
+\r
+       for(i = 8; i <= 9; i++){\r
+//             sprintf(s, "%s:0x%08X", cpu_exception_infos[i], esp[i]);\r
+//             putfonts32_asc(system.data.info.vesa.PhysBasePtr, system.data.info.boot.scrnx, 0, 16 * (i + 4), 0xFFFFFF, s);\r
+\r
+               sprintf(s, "%s:0x%08X\n\r", cpu_exception_infos[i], esp[i]);\r
+               send_serial(s);\r
+       }\r
+\r
+//     putfonts32_asc(system.data.info.vesa.PhysBasePtr, system.data.info.boot.scrnx, 0, 224, 0xFFFFFF, "#PUSH by CPU");\r
+\r
+       send_serial("#PUSH by CPU\n\r");\r
+       for(i = 10; i <= 15; i++){\r
+//             sprintf(s, "%s:0x%08X", cpu_exception_infos[i], esp[i]);\r
+//             putfonts32_asc(system.data.info.vesa.PhysBasePtr, system.data.info.boot.scrnx, 0, 16 * (i + 5), 0xFFFFFF, s);\r
+\r
+               sprintf(s, "%s:0x%08X\n\r", cpu_exception_infos[i], esp[i]);\r
+               send_serial(s);\r
+       }\r
+\r
+       send_serial("#Control Registers\n\r");\r
+       sprintf(s, "CR0 = 0x%08X\n\r", load_cr0());\r
+       send_serial(s);\r
+       sprintf(s, "CR2 = 0x%08X\n\r", load_cr2());\r
+       send_serial(s);\r
+       sprintf(s, "CR3 = 0x%08X\n\r", load_cr3());\r
+       send_serial(s);\r
+\r
+       for(;;){\r
+               io_hlt();\r
+       }\r
+}\r
+\r
+uint cpu_exception_fault(int exception, int *esp)\r
+{\r
+       UI_Task *task = task_now();\r
+       UI_Console *cons;\r
+       uchar s[64];\r
+       uint i;\r
+\r
+       for(i = 0; i < MAX_CONSOLES; i++){\r
+               if(system.ui.console.consoles[i].task == task)break;\r
+       }\r
+       if(system.ui.console.consoles[i].task != task)cpu_exception_abort(exception, esp);\r
+       cons = &system.ui.console.consoles[i];\r
+\r
+       cons_put_str(cons, (uchar *)cpu_exceptions[exception]);\r
+       sprintf(s, "\n%s:0x%08X", cpu_exception_infos[11], esp[11]);\r
+       cons_put_str(cons, s);\r
+\r
+       return (uint)&(task->tss.esp0);\r
+}\r
+\r
+void inthandler00(int *esp)\r
+{\r
+       cpu_exception_abort(0x00, esp);\r
+}\r
+\r
+void inthandler01(int *esp)\r
+{\r
+       cpu_exception_abort(0x01, esp);\r
+}\r
+\r
+void inthandler02(int *esp)\r
+{\r
+       cpu_exception_abort(0x02, esp);\r
+}\r
+\r
+void inthandler03(int *esp)\r
+{\r
+       cpu_exception_abort(0x03, esp);\r
+}\r
+\r
+void inthandler04(int *esp)\r
+{\r
+       cpu_exception_abort(0x04, esp);\r
+}\r
+\r
+void inthandler05(int *esp)\r
+{\r
+       cpu_exception_abort(0x05, esp);\r
+}\r
+\r
+void inthandler06(int *esp)\r
+{\r
+       cpu_exception_abort(0x06, esp);\r
+}\r
+\r
+void inthandler07(int *esp)\r
+{\r
+       cpu_exception_abort(0x07, esp);\r
+}\r
+\r
+void inthandler08(int *esp)\r
+{\r
+       cpu_exception_abort(0x08, esp);\r
+}\r
+\r
+void inthandler09(int *esp)\r
+{\r
+       cpu_exception_abort(0x09, esp);\r
+}\r
+\r
+void inthandler0a(int *esp)\r
+{\r
+       cpu_exception_abort(0x0a, esp);\r
+}\r
+\r
+void inthandler0b(int *esp)\r
+{\r
+       cpu_exception_abort(0x0b, esp);\r
+}\r
+\r
+void inthandler0c(int *esp)\r
+{\r
+       cpu_exception_fault(0x0c, esp);\r
+}\r
+\r
+void inthandler0d(int *esp)\r
+{\r
+       cpu_exception_fault(0x0d, esp);\r
+}\r
+\r
+void inthandler0e(int *esp)\r
+{\r
+       cpu_exception_abort(0x0e, esp);\r
+}\r
+\r
+void inthandler0f(int *esp)\r
+{\r
+       cpu_exception_abort(0x0f, esp);\r
+}\r
+\r
+void inthandler10(int *esp)\r
+{\r
+       cpu_exception_abort(0x10, esp);\r
+}\r
+\r
+void inthandler11(int *esp)\r
+{\r
+       cpu_exception_abort(0x11, esp);\r
+}\r
+\r
+void inthandler12(int *esp)\r
+{\r
+       cpu_exception_abort(0x12, esp);\r
+}\r
+\r
+void inthandler13(int *esp)\r
+{\r
+       cpu_exception_abort(0x13, esp);\r
+}\r
+\r
+void inthandler14(int *esp)\r
+{\r
+       cpu_exception_abort(0x14, esp);\r
+}\r
+\r
+void inthandler15(int *esp)\r
+{\r
+       cpu_exception_abort(0x15, esp);\r
+}\r
+\r
+void inthandler16(int *esp)\r
+{\r
+       cpu_exception_abort(0x16, esp);\r
+}\r
+\r
+void inthandler17(int *esp)\r
+{\r
+       cpu_exception_abort(0x17, esp);\r
+}\r
+\r
+void inthandler18(int *esp)\r
+{\r
+       cpu_exception_abort(0x18, esp);\r
+}\r
+\r
+void inthandler19(int *esp)\r
+{\r
+       cpu_exception_abort(0x19, esp);\r
+}\r
+\r
+void inthandler1a(int *esp)\r
+{\r
+       cpu_exception_abort(0x1a, esp);\r
+}\r
+\r
+void inthandler1b(int *esp)\r
+{\r
+       cpu_exception_abort(0x1b, esp);\r
+}\r
+\r
+void inthandler1c(int *esp)\r
+{\r
+       cpu_exception_abort(0x1c, esp);\r
+}\r
+\r
+void inthandler1d(int *esp)\r
+{\r
+       cpu_exception_abort(0x1d, esp);\r
+}\r
+\r
+void inthandler1e(int *esp)\r
+{\r
+       cpu_exception_abort(0x1e, esp);\r
+}\r
+\r
+void inthandler1f(int *esp)\r
+{\r
+       cpu_exception_abort(0x1f, esp);\r
+}\r