FreeBSDのidtめも

( ..)φメモメモ

FreeBSDinit_secondary()でAPのセットアップ時にlidtで使っているのはr_idt。

664         lidt(&r_idt);

このr_idtはidtなんかと一緒にamd64/include/segments.hで定義されている。

238 extern struct user_segment_descriptor gdt[];
239 extern struct soft_segment_descriptor gdt_segs[];
240 extern struct gate_descriptor *idt;
241 extern struct region_descriptor r_gdt, r_idt;

それで、このr_idtはamd64/amd64/machdep.c

193 struct region_descriptor r_gdt, r_idt;

となっていて、メンバ変数のrd_limit、rd_baseに値を設定るのはamd64の場合だとamd64/amd64/machdep.cのhammer_time()しかfxrで検索した限りだと見つからず。

1705         r_idt.rd_limit = sizeof(idt0) - 1;
1706         r_idt.rd_base = (long) idt;
1707         lidt(&r_idt);

ということからして、amd64はarchに関してはidtにセットするデータはidt0のものが基本的には使われているはず。
hammer_timeはブートするときに呼ばれるっぽい。

   75         /* Get onto a stack that we can trust - there is no going back now. */
   76         movq    $bootstack,%rsp
   77         xorl    %ebp, %ebp
   78 
   79         call    hammer_time             /* set up cpu for unix operation */
   80         movq    %rax,%rsp               /* set up kstack for mi_startup() */
   81         call    mi_startup              /* autoconfiguration, mountroot etc */
   82 0:      hlt
   83         jmp     0b
   84 
   85         .bss
   86         ALIGN_DATA                      /* just to be sure */
   87         .space  0x1000                  /* space for bootstack - temporary stack */