#include #include "kozos.h" #include "thread.h" #include "stublib.h" #include "serial.h" #include "lib.h" #define SERIAL_NUMBER 1 /* Number of registers. */ #define NUMREGS (32+2*32+7) /* GPR(32), FPR(32), SRR0/1, CR, CTR, LR, XER, FPSCR */ enum regnames { GPR0, GPR1, GPR2, GPR3, GPR4, GPR5, GPR6, GPR7, GPR8, GPR9, GPR10, GPR11, GPR12, GPR13, GPR14, GPR15, GPR16, GPR17, GPR18, GPR19, GPR20, GPR21, GPR22, GPR23, GPR24, GPR25, GPR26, GPR27, GPR28, GPR29, GPR30, GPR31, FPRS, /* FPR * 32 */ /* See gdb/ppc-linux-nat.c or gdb/regformats/reg-ppc.dat */ SRR0 = (32+2*32), SRR1, CR, LR, CTR, XER, FPSCR }; #define SP GPR1 #define PC SRR0 #define MSR SRR1 extern int registers[NUMREGS]; kz_thread *gen_thread; void set_debug_traps(void); void handle_exception(int exceptionVector); void exceptionHandler(int vec, void (*f)(void)) { return; } void clearDebugChar() { while (serial_tstc(SERIAL_NUMBER)) serial_getc(SERIAL_NUMBER); } void putDebugChar(int c) { serial_putc(SERIAL_NUMBER, c); } int getDebugChar() { return serial_getc(SERIAL_NUMBER); } int stub_init() { set_debug_traps(); return 0; } void stub_store_regs(kz_thread *thp) { memcpy(®isters[GPR0], &thp->context.gpr[0], sizeof(registers[0]) * 32); memset(®isters[FPRS], 0, sizeof(registers[0]) * 2 * 32); registers[PC] = thp->context.pc; registers[MSR] = thp->context.msr; registers[CR] = thp->context.cr; registers[LR] = thp->context.lr; registers[CTR] = thp->context.ctr; registers[XER] = thp->context.xer; } void stub_restore_regs(kz_thread *thp) { memcpy(&thp->context.gpr[0], ®isters[GPR0], sizeof(registers[0]) * 32); thp->context.pc = registers[PC]; thp->context.msr = registers[MSR]; thp->context.cr = registers[CR]; thp->context.lr = registers[LR]; thp->context.ctr = registers[CTR]; thp->context.xer = registers[XER]; } static void clear_icache_all() { extern unsigned long _etext; int addr; asm volatile ("sync"); asm volatile ("isync"); for (addr = 0x0; addr < (int)&_etext; addr += CFG_CACHELINE_SIZE) { asm volatile ("icbi 0,%0" :: "r"(addr)); } asm volatile ("sync"); asm volatile ("isync"); } int stub_proc(kz_thread *thp, int signo) { gen_thread = thp; stub_store_regs(gen_thread); clearDebugChar(); handle_exception(signo); registers[MSR] &= 0xffff; stub_restore_regs(gen_thread); /* 命令書き換えが行われている場合があるので,命令キャッシュを全クリアする */ clear_icache_all(); return 0; }

AltStyle によって変換されたページ (->オリジナル) /