Preface
I just writin a fn that enables the syscall. Here's the code about making GDT and enabling syscall:
Making GDT:
let kcode = gdt.append(Descriptor::kernel_code_segment());
let kdata = gdt.append(Descriptor::kernel_data_segment());
let udata = gdt.append(Descriptor::user_data_segment());
let ucode = gdt.append(Descriptor::user_code_segment());
let tss = gdt.append(Descriptor::tss_segment(&TSS));
Enabling syscall:
let sel = GDT.1;
Star::write(
sel.user_code, // cs_sysret
sel.user_data, // ss_sysret
sel.kernel_code, // cs_syscall
sel.kernel_data, // ss_syscall
)
.expect("Failed to do STAR register writing");
It didn't panick. But once i do sysret, i found smth weird.
Here's the selectors of the GDT:
After sysret:
That's not expected! My scheduler throw an #GP because of this.
Preface
I just writin a fn that enables the syscall. Here's the code about making GDT and enabling syscall:
Making GDT:
Enabling syscall:
It didn't panick. But once i do
sysret, i found smth weird.Here's the selectors of the GDT:
After
sysret:That's not expected! My scheduler throw an #GP because of this.