1 /*
2  * Copyright (c) 2008 Travis Geiselbrecht
3  *
4  * Use of this source code is governed by a MIT-style
5  * license that can be found in the LICENSE file or at
6  * https://opensource.org/licenses/MIT
7  */
8 #include <stdarg.h>
9 #include <lk/reg.h>
10 #include <stdio.h>
11 #include <kernel/thread.h>
12 #include <platform/armemu/memmap.h>
13 #include <platform/debug.h>
14 
platform_dputc(char c)15 void platform_dputc(char c) {
16     *REG8(DEBUG_STDOUT) = c;
17 }
18 
platform_dgetc(char * c,bool wait)19 int platform_dgetc(char *c, bool wait) {
20     for (;;) {
21         int8_t result = (int8_t)*REG8(DEBUG_STDIN);
22 
23         if (result == -1) {
24             if (wait)
25                 continue;
26             else
27                 return -1;
28         }
29 
30         *c = (char)result;
31         return 0;
32     }
33 }
34 
debug_dump_regs(void)35 void debug_dump_regs(void) {
36     *REG32(DEBUG_REGDUMP) = 1;
37 }
38 
platform_halt(void)39 void platform_halt(void) {
40     *REG32(DEBUG_HALT) = 1;
41     for (;;);
42 }
43 
debug_dump_memory_bytes(void * mem,int len)44 void debug_dump_memory_bytes(void *mem, int len) {
45     *REG32(DEBUG_MEMDUMPADDR) = (unsigned int)mem;
46     *REG32(DEBUG_MEMDUMPLEN) = len;
47     *REG32(DEBUG_MEMDUMP_BYTE) = 1;
48 }
49 
debug_dump_memory_halfwords(void * mem,int len)50 void debug_dump_memory_halfwords(void *mem, int len) {
51     len /= 2;
52 
53     *REG32(DEBUG_MEMDUMPADDR) = (unsigned int)mem;
54     *REG32(DEBUG_MEMDUMPLEN) = len;
55     *REG32(DEBUG_MEMDUMP_HALFWORD) = 1;
56 }
57 
debug_dump_memory_words(void * mem,int len)58 void debug_dump_memory_words(void *mem, int len) {
59     len /= 4;
60 
61     *REG32(DEBUG_MEMDUMPADDR) = (unsigned int)mem;
62     *REG32(DEBUG_MEMDUMPLEN) = len;
63     *REG32(DEBUG_MEMDUMP_WORD) = 1;
64 }
65 
debug_set_trace_level(int trace_type,int level)66 void debug_set_trace_level(int trace_type, int level) {
67     if (trace_type < 0 || trace_type >= 4)
68         return;
69 
70     *REG32(DEBUG_SET_TRACELEVEL_CPU + trace_type * 4) = level;
71 }
72 
debug_cycle_count(void)73 uint32_t debug_cycle_count(void) {
74     return *REG32(DEBUG_CYCLE_COUNT);
75 }
76