Advertisement
Guest User

Untitled

a guest
Dec 25th, 2016
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 2.44 KB | None | 0 0
  1. alias GDTEntry = LibGDT::GDTEntry
  2. alias GDTPointer = LibGDT::GDTPointer
  3. alias TSSEntry = LibTSS::TSSEntry
  4.  
  5. private lib LibGDT
  6.   @[Packed]
  7.   struct GDTEntry
  8.     limit_low : UInt16
  9.     base_low : UInt16
  10.     base_middle : UInt8
  11.     access : UInt8
  12.     granularity : UInt8
  13.     base_high : UInt8
  14.   end
  15.  
  16.   @[Packed]
  17.   struct GDTPointer
  18.     limit : UInt16
  19.     base : UInt32
  20.   end
  21.  
  22.   fun gdt_flush(gdt : UInt32)
  23. end
  24.  
  25. private lib LibTSS
  26.   @[Packed]
  27.   struct TSSEntry
  28.     prev_tss : UInt32
  29.     esp0 : UInt32
  30.     ss0 : UInt32
  31.     esp1 : UInt32
  32.     ss1 : UInt32
  33.     esp2 : UInt32
  34.     ss2 : UInt32
  35.     cr3 : UInt32
  36.     eip : UInt32
  37.     eflags : UInt32
  38.     eax : UInt32
  39.     ecx : UInt32
  40.     edx : UInt32
  41.     ebx : UInt32
  42.     esp : UInt32
  43.     ebp : UInt32
  44.     esi : UInt32
  45.     edi : UInt32
  46.     es : UInt32
  47.     cs : UInt32
  48.     ss : UInt32
  49.     ds : UInt32
  50.     fs : UInt32
  51.     gs : UInt32
  52.     ldt : UInt32
  53.     trap : UInt32
  54.     iomap_base : UInt32
  55.   end
  56.  
  57.   fun tss_flush
  58. end
  59.  
  60. struct GDT
  61.   def initialize
  62.     @ptr = uninitialized GDTPointer
  63.     @gdt = uninitialized GDTEntry[6]
  64.     @tss = uninitialized TSSEntry
  65.  
  66.     @ptr.limit = sizeof(GDTEntry) * 6;
  67.     @ptr.base = pointerof(@gdt).address.to_u32
  68.  
  69.     set_gate 0u32, 0u32, 0u32, 0u8, 0u8
  70.     set_gate 1u32, 0u32, 0xFFFFFFFFu32, 0x9Au8, 0xCFu8
  71.     set_gate 2u32, 0u32, 0xFFFFFFFFu32, 0x92u8, 0xCFu8
  72.     set_gate 3u32, 0u32, 0xFFFFFFFFu32, 0xFAu8, 0xCFu8
  73.     set_gate 4u32, 0u32, 0xFFFFFFFFu32, 0xF2u8, 0xCFu8
  74.  
  75.     write_tss 5u32, 0x10u16, 0x00u32
  76.  
  77.     print "before_flush"
  78.  
  79.     LibGDT.gdt_flush pointerof(@ptr).address.to_u32
  80.     print "after_flush"
  81.     LibTSS.tss_flush
  82.   end
  83.  
  84.   def set_gate(num : UInt32, base : UInt32, limit : UInt32, access : UInt8, gran : UInt8)
  85.     @gdt[num].base_low = base.to_u16
  86.     @gdt[num].base_middle = (base >> 16).to_u8
  87.     @gdt[num].base_high = (base >> 24).to_u8
  88.     @gdt[num].limit_low = limit.to_u16
  89.     @gdt[num].granularity = ((limit >> 16) & 0x0F).to_u8
  90.     @gdt[num].granularity |= (gran & 0xF0).to_u8
  91.     @gdt[num].access = access
  92.   end
  93.  
  94.   def write_tss(num : UInt32, ss0 : UInt16, esp0 : UInt32)
  95.     base = pointerof(@tss).address.to_u32
  96.     limit = base + sizeof(TSSEntry)
  97.  
  98.     set_gate num, base, limit, 0xE9u8, 0x00u8
  99.     memset pointerof(@tss).as Void*, 0u8, sizeof(TSSEntry).to_u32
  100.  
  101.     @tss.ss0 = ss0
  102.     @tss.esp0 = esp0
  103.     @tss.cs = 0x0B
  104.     @tss.ss = @tss.ds = @tss.es = @tss.fs = @tss.gs = 0x13;
  105.   end
  106. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement