( ..)φメモメモ
FreeBSDのinit_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 */