Advertisement
Guest User

Untitled

a guest
Dec 25th, 2016
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 2.58 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.   @@instance = Singleton(GDT).new
  62.   @ptr = uninitialized GDTPointer
  63.   @gdt = uninitialized GDTEntry[6]
  64.   @tss = uninitialized TSSEntry
  65.  
  66.   def self.init
  67.     instance = @@instance.get
  68.     instance.@ptr.limit = sizeof(GDTEntry) * 6;
  69.     instance.@ptr.base = pointerof(instance.@gdt).address.to_u32
  70.  
  71.     instance.set_gate 0u32, 0u32, 0u32, 0u8, 0u8
  72.     instance.set_gate 1u32, 0u32, 0xFFFFFFFFu32, 0x9Au8, 0xCFu8
  73.     instance.set_gate 2u32, 0u32, 0xFFFFFFFFu32, 0x92u8, 0xCFu8
  74.     instance.set_gate 3u32, 0u32, 0xFFFFFFFFu32, 0xFAu8, 0xCFu8
  75.     instance.set_gate 4u32, 0u32, 0xFFFFFFFFu32, 0xF2u8, 0xCFu8
  76.  
  77.     instance.write_tss 5u32, 0x10u16, 0x00u32
  78.  
  79.     print "before_flush"
  80.  
  81.     LibGDT.gdt_flush pointerof(instance.@ptr).address.to_u32
  82.     print "after_flush"
  83.     LibTSS.tss_flush
  84.   end
  85.  
  86.   def set_gate(num : UInt32, base : UInt32, limit : UInt32, access : UInt8, gran : UInt8)
  87.     @gdt[num].base_low = base.to_u16
  88.     @gdt[num].base_middle = (base >> 16).to_u8
  89.     @gdt[num].base_high = (base >> 24).to_u8
  90.     @gdt[num].limit_low = limit.to_u16
  91.     @gdt[num].granularity = ((limit >> 16) & 0x0F).to_u8
  92.     @gdt[num].granularity |= (gran & 0xF0).to_u8
  93.     @gdt[num].access = access
  94.   end
  95.  
  96.   def write_tss(num : UInt32, ss0 : UInt16, esp0 : UInt32)
  97.     base = pointerof(@tss).address.to_u32
  98.     limit = base + sizeof(TSSEntry)
  99.  
  100.     set_gate num, base, limit, 0xE9u8, 0x00u8
  101.     memset pointerof(@tss).as Void*, 0u8, sizeof(TSSEntry).to_u32
  102.  
  103.     @tss.ss0 = ss0
  104.     @tss.esp0 = esp0
  105.     @tss.cs = 0x0B
  106.     @tss.ss = @tss.ds = @tss.es = @tss.fs = @tss.gs = 0x13;
  107.   end
  108. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement