#include #define STS_IG32 0xE // 32-bit Interrupt Gate #define STS_TG32 0xF // 32-bit Trap Gate typedef unsigned uint32_t; #define SETGATE(gate, istrap, sel, off, dpl) { \ (gate).gd_off_15_0 = (uint32_t)(off) & 0xffff; \ (gate).gd_ss = (sel); \ (gate).gd_args = 0; \ (gate).gd_rsv1 = 0; \ (gate).gd_type = (istrap) ? STS_TG32 : STS_IG32; \ (gate).gd_s = 0; \ (gate).gd_dpl = (dpl); \ (gate).gd_p = 1; \ (gate).gd_off_31_16 = (uint32_t)(off) >> 16; \ } /* Gate descriptors for interrupts and traps */ struct gatedesc { unsigned gd_off_15_0 : 16; // low 16 bits of offset in segment unsigned gd_ss : 16; // segment selector unsigned gd_args : 5; // # args, 0 for interrupt/trap gates unsigned gd_rsv1 : 3; // reserved(should be zero I guess) unsigned gd_type : 4; // type(STS_{TG,IG32,TG32}) unsigned gd_s : 1; // must be 0 (system) unsigned gd_dpl : 2; // descriptor(meaning new) privilege level unsigned gd_p : 1; // Present unsigned gd_off_31_16 : 16; // high bits of offset in segment }; int main(void) { unsigned before; unsigned intr; unsigned after; struct gatedesc gintr; intr=8; before=after=0; gintr=*((struct gatedesc *)&intr); SETGATE(gintr, 0,1,2,3); intr=*(unsigned *)&(gintr); printf("intr is 0x%x\n",intr); printf("gintr is 0x%llx\n",gintr); return 0; } // other examples //ex1 #if 0 #include #include #include #include #define STS_TG32 0xF #define STS_IG32 0xE #define SETGATE( gate, istrap, sel, off, dpl) { \ (gate).gd_off_15_0 = (uint32_t)(off) & 0xffff; \ (gate).gd_ss = (sel); \ (gate).gd_args = 0; \ (gate).gd_rsv1 = 0; \ (gate).gd_type = (istrap) ? STS_TG32 : STS_IG32; \ (gate).gd_s = 0; \ (gate).gd_dpl = (dpl); \ (gate).gd_p = 1; \ (gate).gd_off_31_16 = (uint32_t)(off) >> 16; \ } using namespace std; struct gatedesc { unsigned gd_off_15_0 : 16; // low 16 bits of offset in segment unsigned gd_ss : 16; // segment selector unsigned gd_args : 5; // # args, 0 for interrupt/trap gates unsigned gd_rsv1 : 3; // reserved(should be zero I guess) unsigned gd_type : 4; // type(STS_{TG,IG32,TG32}) unsigned gd_s : 1; // must be 0 (system) unsigned gd_dpl : 2; // descriptor(meaning new) privilege level unsigned gd_p : 1; // Present unsigned gd_off_31_16 : 16; // high bits of offset in segment }; int main() { gatedesc intr; intr.gd_off_15_0 = 8; intr.gd_ss = 0; intr.gd_args = 0; intr.gd_rsv1 = 0; intr.gd_type = 0; intr.gd_s = 0; intr.gd_dpl = 0; intr.gd_p = 0; intr.gd_off_31_16 = 0; SETGATE( intr, 0,1,2,3); printf( "%u\n", intr); printf( "%x", intr); return 0; } #endif //ex2 #if 0 #include "stdlib.h" struct gatedesc { unsigned gd_off_15_0 : 16; // low 16 bits of offset in segment unsigned gd_ss : 16; // segment selector unsigned gd_args : 5; // # args, 0 for interrupt/trap gates unsigned gd_rsv1 : 3; // reserved(should be zero I guess) unsigned gd_type : 4; // type(STS_{TG,IG32,TG32}) unsigned gd_s : 1; // must be 0 (system) unsigned gd_dpl : 2; // descriptor(meaning new) privilege level unsigned gd_p : 1; // Present unsigned gd_off_31_16 : 16; // high bits of offset in segment }; typedef struct gatedesc gatedesc; typedef unsigned int uint32_t; #define STS_IG32 0xE // 32-bit Interrupt Gate #define STS_TG32 0xF // 32-bit Trap Gate #define SETGATE(gate, istrap, sel, off, dpl) { \ ((gatedesc*)(&gate))->gd_off_15_0 = (uint32_t)(off) & 0xffff; \ ((gatedesc*)(&gate))->gd_ss = (sel); \ ((gatedesc*)(&gate))->gd_args = 0; \ ((gatedesc*)(&gate))->gd_rsv1 = 0; \ ((gatedesc*)(&gate))->gd_type = (istrap) ? STS_TG32 : STS_IG32; \ ((gatedesc*)(&gate))->gd_s = 0; \ ((gatedesc*)(&gate))->gd_dpl = (dpl); \ ((gatedesc*)(&gate))->gd_p = 1; \ ((gatedesc*)(&gate))->gd_off_31_16 = (uint32_t)(off) >> 16; \ } int main() { unsigned intr; intr=8; SETGATE(intr, 0,1,2,3); printf("%d", intr); return 0; } #endif