diff --git a/src/arch/x86/gdt.rs b/src/arch/x86/gdt.rs
index fb73e23a79..d5c9304691 100644
--- a/src/arch/x86/gdt.rs
+++ b/src/arch/x86/gdt.rs
@@ -4,6 +4,8 @@ use core::convert::TryInto;
use core::mem;
use core::ptr::addr_of_mut;
+use crate::LogicalCpuId;
+
use x86::bits32::task::TaskStateSegment;
use x86::Ring;
use x86::dtables::{self, DescriptorTablePointer};
@@ -124,7 +126,7 @@ pub unsafe fn init() {
}
/// Initialize GDT and configure percpu.
-pub unsafe fn init_paging(stack_offset: usize, cpu_id: usize) {
+pub unsafe fn init_paging(stack_offset: usize, cpu_id: LogicalCpuId) {
let pcr_frame = crate::memory::allocate_frames(1).expect("failed to allocate PCR frame");
let pcr = &mut *(RmmA::phys_to_virt(pcr_frame.start_address()).data() as *mut ProcessorControlRegion);
diff --git a/src/arch/x86/idt.rs b/src/arch/x86/idt.rs
index b97897043f..beb0a99ec0 100644
--- a/src/arch/x86/idt.rs
+++ b/src/arch/x86/idt.rs
@@ -8,7 +8,7 @@ use alloc::collections::BTreeMap;
use x86::segmentation::Descriptor as X86IdtEntry;
use x86::dtables::{self, DescriptorTablePointer};
-use crate::interrupt::*;
+use crate::{interrupt::*, LogicalCpuId};
use crate::ipi::IpiKind;
use spin::RwLock;
@@ -68,10 +68,10 @@ impl Idt {
static mut INIT_BSP_IDT: Idt = Idt::new();
// TODO: VecMap?
-pub static IDTS: RwLock