embox

Форк
0
/
utils.c 
109 строк · 2.1 Кб
1
/**
2
 * @file
3
 * @brief
4
 *
5
 * @author Aleksey Zhmulin
6
 * @date 15.05.23
7
 */
8
#include <stddef.h>
9
#include <stdint.h>
10
#include <stdbool.h>
11

12
#include <debug/gdbstub.h>
13

14
static const char *hexchars = "0123456789abcdef";
15

16
void gdb_pack_str(struct gdb_packet *pkt, const char *str) {
17
	char ch;
18

19
	while ((ch = *str++)) {
20
		pkt->checksum += ch;
21
		pkt->buf[pkt->size++] = ch;
22
	}
23
}
24

25
void gdb_pack_mem(struct gdb_packet *pkt, const void *mem, size_t nbyte) {
26
	const uint8_t *ptr;
27
	const uint8_t *end;
28
	uint8_t byte;
29
	char ch;
30

31
	ptr = (const uint8_t *)mem;
32
	end = ptr + nbyte;
33

34
	while (ptr != end) {
35
		byte = *ptr++;
36
		ch = hexchars[byte >> 4];
37
		pkt->checksum += ch;
38
		pkt->buf[pkt->size++] = ch;
39
		ch = hexchars[byte & 0xf];
40
		pkt->checksum += ch;
41
		pkt->buf[pkt->size++] = ch;
42
	}
43
}
44

45
void gdb_pack_begin(struct gdb_packet *pkt) {
46
	pkt->buf[0] = '$';
47
	pkt->size = 1;
48
	pkt->checksum = 0;
49
}
50

51
void gdb_pack_end(struct gdb_packet *pkt) {
52
	pkt->buf[pkt->size++] = '#';
53
	pkt->buf[pkt->size++] = hexchars[pkt->checksum >> 4];
54
	pkt->buf[pkt->size++] = hexchars[pkt->checksum & 0xf];
55
}
56

57
bool gdb_check_mem(uintptr_t addr) {
58
	extern char _text_vma, _rodata_vma, _data_vma, _bss_vma;
59
	extern char _text_len, _rodata_len, _data_len, _bss_len_with_reserve;
60

61
	struct {
62
		uintptr_t base;
63
		uintptr_t len;
64
	} sect[4] = {
65
	    {(uintptr_t)&_bss_vma, (uintptr_t)&_bss_len_with_reserve},
66
	    {(uintptr_t)&_text_vma, (uintptr_t)&_text_len},
67
	    {(uintptr_t)&_data_vma, (uintptr_t)&_data_len},
68
	    {(uintptr_t)&_rodata_vma, (uintptr_t)&_rodata_len},
69
	};
70
	int i;
71
	bool ret;
72

73
	ret = false;
74

75
	for (i = 0; i < 4; i++) {
76
		if ((sect[i].base <= addr) && (addr < sect[i].base + sect[i].len)) {
77
			ret = true;
78
			break;
79
		}
80
	}
81

82
	return ret;
83
}
84

85
#if 0
86
#include <mem/mmap.h>
87
#include <lib/libds/dlist.h>
88
#include <kernel/task/kernel_task.h>
89
#include <kernel/task/resource/mmap.h>
90

91
bool gdb_check_mem(uintptr_t addr) {
92
	struct marea *marea;
93
	struct emmap *emmap;
94
	bool ret;
95

96
	ret = false;
97
	emmap = task_resource_mmap(task_kernel_task());
98

99
	dlist_foreach_entry(marea, &emmap->marea_list, mmap_link) {
100
		if (addr && (marea->start <= addr) &&
101
		    (addr < marea->start + marea->size)) {
102
			ret = true;
103
			break;
104
		}
105
	}
106

107
	return ret;
108
}
109
#endif
110

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.