From 80fd4a704537a15e96903b11b67078b1174b9646 Mon Sep 17 00:00:00 2001 From: PanQL Date: Fri, 8 May 2020 15:03:07 +0800 Subject: [PATCH 1/2] add hal_read_tsc --- kernel-hal-bare/src/arch/x86_64/mod.rs | 5 +++++ kernel-hal/src/dummy.rs | 7 +++++++ zircon-loader/src/lib.rs | 3 +++ zircon-object/src/task/thread.rs | 10 ++++++++++ zircon-syscall/src/time.rs | 5 ++++- 5 files changed, 29 insertions(+), 1 deletion(-) diff --git a/kernel-hal-bare/src/arch/x86_64/mod.rs b/kernel-hal-bare/src/arch/x86_64/mod.rs index 41bdb2e3c..0c30c2a5a 100644 --- a/kernel-hal-bare/src/arch/x86_64/mod.rs +++ b/kernel-hal-bare/src/arch/x86_64/mod.rs @@ -373,3 +373,8 @@ static mut CONFIG: Config = Config { acpi_rsdp: 0, smbios: 0, }; + +#[export_name = "hal_read_tsc"] +pub fn read_tsc() -> u64 { + unsafe { core::arch::x86_64::_rdtsc() } +} diff --git a/kernel-hal/src/dummy.rs b/kernel-hal/src/dummy.rs index 6007f65c9..2e1edcbad 100644 --- a/kernel-hal/src/dummy.rs +++ b/kernel-hal/src/dummy.rs @@ -285,3 +285,10 @@ pub fn fetch_fault_vaddr() -> VirtAddr { pub fn pc_firmware_tables() -> (u64, u64) { unimplemented!() } + +/// Read tsc register to get current time +#[linkage = "weak"] +#[export_name = "hal_read_tsc"] +pub fn read_tsc() -> u64 { + unimplemented!() +} diff --git a/zircon-loader/src/lib.rs b/zircon-loader/src/lib.rs index 4a5ff45aa..f978bf639 100644 --- a/zircon-loader/src/lib.rs +++ b/zircon-loader/src/lib.rs @@ -192,7 +192,10 @@ fn spawn(thread: Arc) { let mut cx = thread.wait_for_run().await; trace!("go to user: {:#x?}", cx); debug!("switch to {}|{}", thread.proc().name(), thread.name()); + let tmp_time = kernel_hal::read_tsc(); kernel_hal::context_run(&mut cx); + let time = kernel_hal::read_tsc() - tmp_time; + thread.time_add(time); trace!("back from user: {:#x?}", cx); EXCEPTIONS_USER.add(1); let mut exit = false; diff --git a/zircon-object/src/task/thread.rs b/zircon-object/src/task/thread.rs index 437eb3c12..e5d93bc00 100644 --- a/zircon-object/src/task/thread.rs +++ b/zircon-object/src/task/thread.rs @@ -116,6 +116,8 @@ struct ThreadInner { /// NOTE: This variable will never be `Suspended`. On suspended, the /// `suspend_count` is non-zero, and this represents the state before suspended. state: ThreadState, + /// The time this thread has run on cpu + time: u64, } impl Thread { @@ -345,6 +347,14 @@ impl Thread { pub fn get_exceptionate(&self) -> Arc { self.exceptionate.clone() } + + pub fn time_add(&self, time: u64) { + self.inner.lock().time += time; + } + + pub fn get_time(&self) -> u64 { + self.inner.lock().time + } } pub trait IntoResult { diff --git a/zircon-syscall/src/time.rs b/zircon-syscall/src/time.rs index 4e608f245..619d13081 100644 --- a/zircon-syscall/src/time.rs +++ b/zircon-syscall/src/time.rs @@ -27,7 +27,10 @@ impl Syscall<'_> { time.write(timer_now().as_nanos() as u64 + UTC_OFFSET.load(Ordering::Relaxed))?; Ok(()) } - ZX_CLOCK_THREAD => unimplemented!(), + ZX_CLOCK_THREAD => { + time.write(self.thread.get_time())?; + Ok(()) + } _ => Err(ZxError::NOT_SUPPORTED), } } From 09d721b5ee188d0edb4d150f10aa4edd262f459e Mon Sep 17 00:00:00 2001 From: PanQL Date: Tue, 12 May 2020 13:04:57 +0800 Subject: [PATCH 2/2] use timer_now instead of read_tsc --- kernel-hal-bare/src/arch/x86_64/mod.rs | 5 ----- kernel-hal/src/dummy.rs | 7 ------- zircon-loader/src/lib.rs | 4 ++-- zircon-object/src/task/thread.rs | 6 +++--- 4 files changed, 5 insertions(+), 17 deletions(-) diff --git a/kernel-hal-bare/src/arch/x86_64/mod.rs b/kernel-hal-bare/src/arch/x86_64/mod.rs index 0c30c2a5a..41bdb2e3c 100644 --- a/kernel-hal-bare/src/arch/x86_64/mod.rs +++ b/kernel-hal-bare/src/arch/x86_64/mod.rs @@ -373,8 +373,3 @@ static mut CONFIG: Config = Config { acpi_rsdp: 0, smbios: 0, }; - -#[export_name = "hal_read_tsc"] -pub fn read_tsc() -> u64 { - unsafe { core::arch::x86_64::_rdtsc() } -} diff --git a/kernel-hal/src/dummy.rs b/kernel-hal/src/dummy.rs index 2e1edcbad..6007f65c9 100644 --- a/kernel-hal/src/dummy.rs +++ b/kernel-hal/src/dummy.rs @@ -285,10 +285,3 @@ pub fn fetch_fault_vaddr() -> VirtAddr { pub fn pc_firmware_tables() -> (u64, u64) { unimplemented!() } - -/// Read tsc register to get current time -#[linkage = "weak"] -#[export_name = "hal_read_tsc"] -pub fn read_tsc() -> u64 { - unimplemented!() -} diff --git a/zircon-loader/src/lib.rs b/zircon-loader/src/lib.rs index f978bf639..40f6a4626 100644 --- a/zircon-loader/src/lib.rs +++ b/zircon-loader/src/lib.rs @@ -192,9 +192,9 @@ fn spawn(thread: Arc) { let mut cx = thread.wait_for_run().await; trace!("go to user: {:#x?}", cx); debug!("switch to {}|{}", thread.proc().name(), thread.name()); - let tmp_time = kernel_hal::read_tsc(); + let tmp_time = kernel_hal::timer_now().as_nanos(); kernel_hal::context_run(&mut cx); - let time = kernel_hal::read_tsc() - tmp_time; + let time = kernel_hal::timer_now().as_nanos() - tmp_time; thread.time_add(time); trace!("back from user: {:#x?}", cx); EXCEPTIONS_USER.add(1); diff --git a/zircon-object/src/task/thread.rs b/zircon-object/src/task/thread.rs index e5d93bc00..539c69f7c 100644 --- a/zircon-object/src/task/thread.rs +++ b/zircon-object/src/task/thread.rs @@ -117,7 +117,7 @@ struct ThreadInner { /// `suspend_count` is non-zero, and this represents the state before suspended. state: ThreadState, /// The time this thread has run on cpu - time: u64, + time: u128, } impl Thread { @@ -348,12 +348,12 @@ impl Thread { self.exceptionate.clone() } - pub fn time_add(&self, time: u64) { + pub fn time_add(&self, time: u128) { self.inner.lock().time += time; } pub fn get_time(&self) -> u64 { - self.inner.lock().time + self.inner.lock().time as u64 } }