/** * IDT flag overview * * flags = x xx 0x11x 000 ????? * | | | \ SS = Storage Segment (0 for interrupts) * | | \ D = Size of gate: 1 = 32 bits; 0 = 16 bits * | \ DPL = Num. higher PL from which it is accessible * \ P = Segment Present bit */ void setInterruptHandler(int vector, void (*handler)(), int maxAccessibleFromPL) { Word flags = (Word)(maxAccessibleFromPL << 13); flags |= 0x8E00; // P = 1, D = 1, Type = 1110 (Interrupt Gate) idt[vector].lowOffset = lowWord((DWord)handler); idt[vector].segmentSelector = __KERNEL_CS; idt[vector].flags = flags; idt[vector].highOffset = highWord((DWord)handler); }
void setTrapHandler(int vector, void (*handler)(), int maxAccessibleFromPL) { Word flags = (Word)(maxAccessibleFromPL << 13); // Changed to 0x8e00 to convert it to an 'interrupt gate' and so the system calls will be thread-safe. flags |= 0x8e00; // P = 1, D = 1, Type = 1110 (Interrupt Gate) //flags |= 0x8F00; // P = 1, D = 1, Type = 1111 (Trap Gate) idt[vector].lowOffset = lowWord((DWord)handler); idt[vector].segmentSelector = __KERNEL_CS; idt[vector].flags = flags; idt[vector].highOffset = highWord((DWord)handler); }
void setInterruptHandler(int vector, void (*handler)(), int maxAccessibleFromPL) { /***********************************************************************/ /* THE INTERRUPTION GATE FLAGS: R1: pg. 5-11 */ /* *************************** */ /* flags = x xx 0x110 000 ????? */ /* | | | */ /* | | \ D = Size of gate: 1 = 32 bits; 0 = 16 bits */ /* | \ DPL = Num. higher PL from which it is accessible */ /* \ P = Segment Present bit */ /***********************************************************************/ Word flags = (Word)(maxAccessibleFromPL << 13); flags |= 0x8E00; /* P = 1, D = 1, Type = 1110 (Interrupt Gate) */ idt[vector].lowOffset = lowWord((DWord)handler); idt[vector].segmentSelector = __KERNEL_CS; idt[vector].flags = flags; idt[vector].highOffset = highWord((DWord)handler); }
void setTrapHandler(int vector, void (*handler)(), int maxAccessibleFromPL) { /***********************************************************************/ /* THE TRAP GATE FLAGS: R1: pg. 5-11 */ /* ******************** */ /* flags = x xx 0x111 000 ????? */ /* | | | */ /* | | \ D = Size of gate: 1 = 32 bits; 0 = 16 bits */ /* | \ DPL = Num. higher PL from which it is accessible */ /* \ P = Segment Present bit */ /***********************************************************************/ Word flags = (Word)(maxAccessibleFromPL << 13); //flags |= 0x8F00; /* P = 1, D = 1, Type = 1111 (Trap Gate) */ /* Changed to 0x8e00 to convert it to an 'interrupt gate' and so the system calls will be thread-safe. */ flags |= 0x8E00; /* P = 1, D = 1, Type = 1110 (Interrupt Gate) */ idt[vector].lowOffset = lowWord((DWord)handler); idt[vector].segmentSelector = __KERNEL_CS; idt[vector].flags = flags; idt[vector].highOffset = highWord((DWord)handler); }
DSCREC * PASCAL CODESIZE regcheck ( DSCREC *arg, UCHAR minus, register struct exprec *ptr ){ struct psop *pso; /* parse stack operand structure */ register struct ar *pAR; USHORT reg; pso = &(arg->dsckind.opnd); pAR = ptr->p->p; if (M_REGRESULT & pso->dtype) { /* Is some register */ if (ptr->p->parenflag || pAR->bracklevel) { /* Have index reg in []s */ /* Lose size based on register */ pso->dsize = 0; reg = pso->dsegment->offset; /* Must be index or ptr reg */ switch(pso->dsegment->symu.regsym.regtype) { default: errorc (E_IBR); break; case INDREG: if (reg <= 5) /* Have base reg BX | BP */ if (pAR->base) errorc (E_DBR); else pAR->base = reg; else /* Have index reg DI | SI */ if (pAR->index) errorc (E_DIR); else pAR->index = reg; break; #ifdef V386 case DWRDREG: /* Have 386 reg in []s */ if (minus == 2) { if (pAR->index & 0xf) errorc(E_DIR); pAR->index |= 8 | reg; } else if (pAR->base) { if (pAR->index) errorc(E_DIR); if (reg == 4) { /* swap base with index * to allow [index][eSp] */ pAR->index = pAR->base; pAR->base = 4|8; } else pAR->index = reg|8; } else pAR->base = reg|8; break; #endif /* V386 */ } if (minus == TRUE && (ptr->valright == arg)) errorc (E_IUR); oblititem (arg); return (defaultdsc ()); } else { errorc(E_IUR); return (arg); } } #ifdef V386 /* scaled indexing modes */ else if (minus == 2 && (M_RCONST & pso->dtype)) { if (pAR->index&0x70) errorc(E_MBR); if (highWord(arg->dsckind.opnd.doffset)) goto scaleErr; switch((SHORT) arg->dsckind.opnd.doffset) { case 1: pAR->index |= 0x10; break; case 2: pAR->index |= 0x20; break; case 4: pAR->index |= 0x30; break; case 8: pAR->index |= 0x40; break; scaleErr: default: error(E_EXP, "scale value of 1,2,4 or 8"); } oblititem (arg); return (defaultdsc ()); } #endif /* V386 */ else return (arg); }