|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT/PLAT_RASPI PATCH 09/13] plats/raspi: Adding timer related and platform information functions
Adding timer related and platform information functions.
Signed-off-by: Santiago Pagani <santiagopagani@xxxxxxxxx>
---
include/raspi/raspi_info.h | 49 +++++++++++
include/raspi/time.h | 91 +++++++++++++++++++
raspi_info.c | 63 ++++++++++++++
raspi_info_asm.S | 89 +++++++++++++++++++
time.c | 173 +++++++++++++++++++++++++++++++++++++
5 files changed, 465 insertions(+)
create mode 100644 include/raspi/raspi_info.h
create mode 100644 include/raspi/time.h
create mode 100644 raspi_info.c
create mode 100644 raspi_info_asm.S
create mode 100644 time.c
diff --git a/include/raspi/raspi_info.h b/include/raspi/raspi_info.h
new file mode 100644
index 0000000..8013dd5
--- /dev/null
+++ b/include/raspi/raspi_info.h
@@ -0,0 +1,49 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Authors: Santiago Pagani <santiagopagani@xxxxxxxxx>
+ *
+ * Copyright (c) 2020, NEC Laboratories Europe GmbH, NEC Corporation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
+ */
+
+#ifndef __RASPI_INFO_H__
+#define __RASPI_INFO_H__
+
+#include <stdint.h>
+
+unsigned long get_el ( void );
+unsigned long get_spsel ( void );
+unsigned long get_sctlr_el1 ( void );
+unsigned long get_unikraft_text_size ( void );
+unsigned long get_unikraft_data_size ( void );
+unsigned long get_unikraft_bss_size ( void );
+uint64_t computeUsedStack( void );
+
+#endif /* __RASPI_INFO_H__ */
diff --git a/include/raspi/time.h b/include/raspi/time.h
new file mode 100644
index 0000000..f788a66
--- /dev/null
+++ b/include/raspi/time.h
@@ -0,0 +1,91 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Authors: Santiago Pagani <santiagopagani@xxxxxxxxx>
+ *
+ * Copyright (c) 2020, NEC Laboratories Europe GmbH, NEC Corporation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
+ */
+
+#ifndef __RASPI_TIME_H__
+#define __RASPI_TIME_H__
+
+#include "sysregs.h"
+#include <stdint.h>
+
+#define RASPI_SYS_TIMER_BASE MMIO_BASE
+#define RASPI_SYS_TIMER_CS ((volatile uint32_t
*)(RASPI_SYS_TIMER_BASE+0x00003000))
+#define RASPI_SYS_TIMER_CLO ((volatile uint32_t
*)(RASPI_SYS_TIMER_BASE+0x00003004))
+#define RASPI_SYS_TIMER_CHI ((volatile uint32_t
*)(RASPI_SYS_TIMER_BASE+0x00003008))
+#define RASPI_SYS_TIMER_C0 ((volatile uint32_t
*)(RASPI_SYS_TIMER_BASE+0x0000300C))
+#define RASPI_SYS_TIMER_C1 ((volatile uint32_t
*)(RASPI_SYS_TIMER_BASE+0x00003010))
+#define RASPI_SYS_TIMER_C2 ((volatile uint32_t
*)(RASPI_SYS_TIMER_BASE+0x00003014))
+#define RASPI_SYS_TIMER_C3 ((volatile uint32_t
*)(RASPI_SYS_TIMER_BASE+0x00003018))
+
+#define RASPI_SYS_TIMER_CS_M0 (1 << 0)
+#define RASPI_SYS_TIMER_CS_M1 (1 << 1)
+#define RASPI_SYS_TIMER_CS_M2 (1 << 2)
+#define RASPI_SYS_TIMER_CS_M3 (1 << 3)
+
+
+#define RASPI_ARM_TIMER_BASE (MMIO_BASE + 0x1000000)
+#define RASPI_ARM_C0_TIMER_IRQ_CTL ((volatile uint32_t
*)(RASPI_ARM_TIMER_BASE+0x40))
+#define RASPI_ARM_C0_TIMER_IRQ_CTL_CNTVIRQ_BIT (1 << 3)
+
+
+#define RASPI_ARM_SIDE_TIMER_BASE (MMIO_BASE + 0xB000)
+#define RASPI_ARM_SIDE_TIMER_LOAD ((volatile uint32_t
*)(RASPI_ARM_SIDE_TIMER_BASE+0x400))
+#define RASPI_ARM_SIDE_TIMER_VALUE ((volatile uint32_t
*)(RASPI_ARM_SIDE_TIMER_BASE+0x404))
+#define RASPI_ARM_SIDE_TIMER_CTL ((volatile uint32_t
*)(RASPI_ARM_SIDE_TIMER_BASE+0x408))
+#define RASPI_ARM_SIDE_TIMER_IRQ_CLEAR ((volatile uint32_t
*)(RASPI_ARM_SIDE_TIMER_BASE+0x40C))
+#define RASPI_ARM_SIDE_TIMER_RAW_IRQ ((volatile uint32_t
*)(RASPI_ARM_SIDE_TIMER_BASE+0x410))
+#define RASPI_ARM_SIDE_TIMER_MASKED_IRQ ((volatile uint32_t
*)(RASPI_ARM_SIDE_TIMER_BASE+0x414))
+#define RASPI_ARM_SIDE_TIMER_RELOAD ((volatile uint32_t
*)(RASPI_ARM_SIDE_TIMER_BASE+0x418))
+#define RASPI_ARM_SIDE_TIMER_PREDIVIDER ((volatile uint32_t
*)(RASPI_ARM_SIDE_TIMER_BASE+0x41C))
+#define RASPI_ARM_SIDE_TIMER_FREE ((volatile uint32_t
*)(RASPI_ARM_SIDE_TIMER_BASE+0x420))
+#define RASPI_ARM_SIDE_TIMER_CTL_FREE_COUNTER_BIT (1 << 9)
+#define RASPI_ARM_SIDE_TIMER_CTL_ENABLE_BIT (1 << 7)
+#define RASPI_ARM_SIDE_TIMER_CTL_IRQ_BIT (1 << 5)
+#define RASPI_ARM_SIDE_TIMER_CTL_BITS_BIT (1 << 1)
+
+
+#define raspi_arm_side_timer_get_value() (*RASPI_ARM_SIDE_TIMER_VALUE)
+#define raspi_arm_side_timer_get_load()
(*RASPI_ARM_SIDE_TIMER_LOAD)
+#define raspi_arm_side_timer_irq_enable() {*RASPI_ARM_SIDE_TIMER_CTL =
*RASPI_ARM_SIDE_TIMER_CTL | RASPI_ARM_SIDE_TIMER_CTL_IRQ_BIT; }
+#define raspi_arm_side_timer_irq_disable() {*RASPI_ARM_SIDE_TIMER_CTL =
*RASPI_ARM_SIDE_TIMER_CTL & ~RASPI_ARM_SIDE_TIMER_CTL_IRQ_BIT; }
+#define raspi_arm_side_timer_irq_clear()
{*RASPI_ARM_SIDE_TIMER_IRQ_CLEAR = 1; }
+#define raspi_arm_side_timer_irq_triggered() (*RASPI_ARM_SIDE_TIMER_MASKED_IRQ
& 1)
+
+
+void raspi_irq_delay_measurements_init(void);
+uint64_t get_system_timer(void);
+uint32_t get_timer_irq_delay(void);
+void reset_timer_irq_delay(void);
+
+#endif /* __RASPI_TIME_H__ */
\ No newline at end of file
diff --git a/raspi_info.c b/raspi_info.c
new file mode 100644
index 0000000..b618c15
--- /dev/null
+++ b/raspi_info.c
@@ -0,0 +1,63 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Authors: Santiago Pagani <santiagopagani@xxxxxxxxx>
+ *
+ * Copyright (c) 2020, NEC Laboratories Europe GmbH, NEC Corporation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
+ */
+
+#include <stdint.h>
+#include <uk/config.h>
+
+uint64_t computeUsedStack(void) {
+#if CONFIG_RASPI_WATERMARK_STACK
+ #define MAX_ADDRESS 0x80000
+ #define STACK_START 0
+ #define STACK_SIZE (MAX_ADDRESS - STACK_START)
+ void *address = (void *)(STACK_SIZE/2 + STACK_START);
+ unsigned int step = STACK_SIZE/4;
+
+ while (step >= 8) {
+ uint64_t expectedValue = ((MAX_ADDRESS - (uint64_t)address) >>
3);
+ uint64_t readValue = (uint64_t)*((volatile uint64_t *)address);
+
+ if (expectedValue == readValue) {
+ address = (void *)((uint64_t)address + step);
+ } else {
+ address = (void *)((uint64_t)address - step);
+ }
+ step >>= 1;
+ }
+
+ return MAX_ADDRESS - (uint64_t)address;
+#else
+ return 0;
+#endif
+}
diff --git a/raspi_info_asm.S b/raspi_info_asm.S
new file mode 100644
index 0000000..28215a9
--- /dev/null
+++ b/raspi_info_asm.S
@@ -0,0 +1,89 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Authors: Santiago Pagani <santiagopagani@xxxxxxxxx>
+ *
+ * Copyright (c) 2020, NEC Laboratories Europe GmbH, NEC Corporation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
+ */
+
+.globl get_sp
+get_sp:
+ mov x0, sp
+ ret
+
+.globl get_sp_start
+get_sp_start:
+ ldr x1, =_start
+ ret
+
+.globl get_el
+get_el:
+ mrs x0, CurrentEL
+ lsr x0, x0, #2
+ ret
+
+.globl get_spsel
+get_spsel:
+ mrs x0, SPSel
+ ret
+
+.globl get_sctlr_el1
+get_sctlr_el1:
+ mrs x0, sctlr_el1
+ ret
+
+.globl get_unikraft_text_size
+get_unikraft_text_size:
+ ldr x0, =_text
+ ldr x1, =_ectors
+ sub x0, x1, x0
+ ret
+
+.globl get_unikraft_data_size
+get_unikraft_data_size:
+ ldr x0, =_data
+ ldr x1, =_edata
+ sub x0, x1, x0
+ ldr x1, =_tls_start
+ ldr x2, =_etdata
+ sub x1, x2, x1
+ add x0, x0, x1
+ ret
+
+.globl get_unikraft_bss_size
+get_unikraft_bss_size:
+ ldr x0, =__bss_start
+ ldr x1, =__bss_end
+ sub x0, x1, x0
+ ldr x1, =_etdata
+ ldr x2, =_tls_end
+ sub x1, x2, x1
+ add x0, x0, x1
+ ret
diff --git a/time.c b/time.c
new file mode 100644
index 0000000..3b736ad
--- /dev/null
+++ b/time.c
@@ -0,0 +1,173 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Authors: Santiago Pagani <santiagopagani@xxxxxxxxx>
+ *
+ * Copyright (c) 2020, NEC Laboratories Europe GmbH, NEC Corporation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
+ */
+
+#include <stdlib.h>
+#include <uk/assert.h>
+#include <uk/plat/time.h>
+#include <uk/plat/lcpu.h>
+#include <uk/plat/irq.h>
+#include <uk/bitops.h>
+#include <uk/essentials.h>
+#include <uk/plat/common/cpu.h>
+#include <uk/plat/common/irq.h>
+#include <arm/time.h>
+#include <raspi/time.h>
+#include <raspi/irq.h>
+
+#define RASPI_ARM_SIDE_TIMER_LOAD_INIT (0x00FFFFFF)
+
+static uint32_t timer_irq_delay;
+
+void generic_timer_mask_irq(void)
+{
+ set_el0(cntv_ctl, get_el0(cntv_ctl) | GT_TIMER_MASK_IRQ);
+
+ /* Ensure the write of sys register is visible */
+ isb();
+}
+
+void generic_timer_unmask_irq(void)
+{
+ set_el0(cntv_ctl, get_el0(cntv_ctl) & ~GT_TIMER_MASK_IRQ);
+
+ /* Ensure the write of sys register is visible */
+ isb();
+}
+
+uint32_t generic_timer_get_frequency(int fdt_timer __unused)
+{
+ return get_el0(cntfrq);
+}
+
+unsigned long sched_have_pending_events;
+
+void time_block_until(__snsec until)
+{
+ while ((__snsec) ukplat_monotonic_clock() < until) {
+ generic_timer_cpu_block_until(until);
+ }
+}
+
+/* must be called before interrupts are enabled */
+void ukplat_time_init(void)
+{
+ int rc;
+
+ /*
+ * Monotonic time begins at boot_ticks (first read of counter
+ * before calibration).
+ */
+ generic_timer_update_boot_ticks();
+
+ /* Currently, we only support 1 timer per system */
+ rc = generic_timer_init(0);
+ if (rc < 0)
+ UK_CRASH("Failed to initialize platform time\n");
+
+ rc = ukplat_irq_register(IRQ_ID_ARM_GENERIC_TIMER,
generic_timer_irq_handler, NULL);
+ if (rc < 0)
+ UK_CRASH("Failed to register timer interrupt handler\n");
+
+ /*
+ * Mask IRQ before scheduler start working. Otherwise we will get
+ * unexpected timer interrupts when system is booting.
+ */
+ generic_timer_mask_irq();
+
+ /* Enable timer */
+ generic_timer_enable();
+}
+
+static void raspi_arm_side_timer_init(void)
+{
+ *RASPI_ARM_SIDE_TIMER_CTL = RASPI_ARM_SIDE_TIMER_CTL_ENABLE_BIT |
RASPI_ARM_SIDE_TIMER_CTL_BITS_BIT;
+ *RASPI_ARM_SIDE_TIMER_PREDIVIDER = 0;
+ *RASPI_ARM_SIDE_TIMER_LOAD = RASPI_ARM_SIDE_TIMER_LOAD_INIT;
+}
+
+static int handle_raspi_side_timer_irq(void *arg __unused)
+{
+ uint64_t timerValue1 = raspi_arm_side_timer_get_value();
+ uint64_t timerValue2 = raspi_arm_side_timer_get_value();
+ raspi_arm_side_timer_irq_disable();
+ raspi_arm_side_timer_irq_clear();
+
+ // The counter is decreasing, so to get the delay of the IRQ response
we substract the value of the timer at the entry of this
+ // function from the timer load value. Further, to account for the time
needed to sample the timer, we take a second sample
+ // and also substract the difference beween the two points
+ timer_irq_delay = (raspi_arm_side_timer_get_load() - timerValue1) -
(timerValue1 - timerValue2);
+
+ return 1;
+}
+
+void raspi_irq_delay_measurements_init(void)
+{
+ int rc;
+
+ raspi_arm_side_timer_init();
+
+ rc = ukplat_irq_register(IRQ_ID_RASPI_ARM_SIDE_TIMER,
handle_raspi_side_timer_irq, NULL);
+ if (rc < 0)
+ UK_CRASH("Failed to register timer interrupt handler\n");
+}
+
+/**
+ * Get System Timer's counter
+ */
+uint64_t get_system_timer(void)
+{
+ uint32_t h, l;
+ // we must read MMIO area as two separate 32 bit reads
+ h = *RASPI_SYS_TIMER_CHI;
+ l = *RASPI_SYS_TIMER_CLO;
+ // we have to repeat it if high word changed during read
+ if (h != *RASPI_SYS_TIMER_CHI)
+ {
+ h = *RASPI_SYS_TIMER_CHI;
+ l = *RASPI_SYS_TIMER_CLO;
+ }
+ // compose long int value
+ return ((uint64_t)h << 32) | l;
+}
+
+uint32_t get_timer_irq_delay(void)
+{
+ return timer_irq_delay;
+}
+
+void reset_timer_irq_delay(void)
+{
+ timer_irq_delay = 0;
+}
--
2.17.1
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |