T118: libbarrelfish: Refactor architecture specific debug syscalls. Move common debug...
[barrelfish] / lib / barrelfish / arch / arm / sys_debug.c
1 /**
2  * \file
3  * \brief Debug system calls, specific for arm, user-side
4  */
5
6 /*
7  * Copyright (c) 2007, 2008, 2009, 2010, ETH Zurich.
8  * All rights reserved.
9  *
10  * This file is distributed under the terms in the attached LICENSE file.
11  * If you do not find this file, copies can be found by writing to:
12  * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
13  */
14
15 #include <barrelfish/barrelfish.h>
16 #include <barrelfish/dispatch.h>
17 #include <barrelfish/syscall_arch.h>
18 #include <barrelfish_kpi/sys_debug.h>
19 #include <barrelfish/sys_debug.h>
20 #include <stdio.h>
21 #include <inttypes.h>
22
23 errval_t sys_debug_hardware_timer_read(uintptr_t* v)
24 {
25     struct sysret sr
26         = syscall2(SYSCALL_DEBUG, DEBUG_HARDWARE_TIMER_READ);
27     *v = sr.value;
28     return sr.error;
29 }
30
31 errval_t sys_debug_hardware_timer_hertz_read(uintptr_t* v)
32 {
33     struct sysret sr
34         = syscall2(SYSCALL_DEBUG, DEBUG_HARDWARE_TIMER_HERTZ_READ);
35     *v = sr.value;
36     return sr.error;
37 }
38
39 errval_t sys_debug_hardware_global_timer_read(uint64_t *ret)
40 {
41     struct sysret sr;
42
43     uint32_t l, h;
44
45     do {
46         h = syscall2(SYSCALL_DEBUG, DEBUG_HARDWARE_GLOBAL_TIMER_HIGH).value;
47         l = syscall2(SYSCALL_DEBUG, DEBUG_HARDWARE_GLOBAL_TIMER_LOW).value;
48         // read high again, in case it changed
49         sr = syscall2(SYSCALL_DEBUG, DEBUG_HARDWARE_GLOBAL_TIMER_HIGH);
50     } while(h != sr.value && err_is_ok(sr.error));
51
52     if(err_is_ok(sr.error) && ret) {
53         *ret = (((uint64_t) h) << 32) | ((uint32_t) l);
54     }
55
56     return sr.error;
57 }