|
|
- #include <stdio.h>
-
- #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 <stdlib.h>
- #include <stdio.h>
- #include <iostream>
- #include <cstring>
-
- #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
|