Поведение в файле riscv/insns/<new_instruction_name>.h. Изучите другие инструкции в этом каталоге для начала.
$ cd ../riscv-opcodes
$ vi opcodes // добавьте строку для новой инструкции
$ make install
Добавьте инструкцию в riscv/riscv.mk.in. Иначе инструкция не будет включена в сборку и будет рассматриваться как незаконная инструкция.
Пересоберите симулятор.
Чтобы вызвать интерактивный режим отладки, запустите spike с параметром -d:
$ spike -d pk hello
Для просмотра содержимого целочисленного регистра (0 — для ядра 0):
: reg 0 a0
Для просмотра содержимого регистра с плавающей точкой:
: fregs 0 ft0
или:
: fregd 0 ft0
в зависимости от того, хотите ли вы распечатать регистр как одинарную или двойную точность.
Чтобы просмотреть содержимое ячейки памяти (физический адрес в шестнадцатеричном формате):
: mem 2020
Чтобы увидеть содержимое памяти с виртуальным адресом (0 для ядра 0):
: mem 0 2020
Вы можете перейти на одну инструкцию вперёд, нажав клавишу Enter. Вы также можете выполнить команду до достижения желаемого равенства:
: until pc 0 2020 (остановиться, когда pc=2020)
: until reg 0 mie a (остановиться, когда регистр mie=0xa)
: until mem 2020 50a9907311096993 (остановиться, когда mem[2020]=50a9907311096993)
Или вы можете выполнять команду, пока равенство истинно:
: while mem 2020 50a9907311096993
Вы можете продолжить выполнение бесконечно:
: r
В любой момент во время выполнения (даже без -d) вы можете войти в интерактивный режим отладки с помощью <control>-<c>
.
Чтобы завершить моделирование из режима отладки, нажмите <control>-<c>
или:
: q
Альтернативой интерактивному режиму отладки является подключение с использованием gdb. Поскольку spike пытается имитировать реальное оборудование, вам также понадобится OpenOCD для этого. OpenOCD в настоящее время не знает о преобразовании адресов, поэтому нелегко отлаживать программы, которые запускаются под pk
. Мы будем использовать следующую тестовую программу:
char text[] = "Vafgehpgvba frgf jnag gb or serr!";
// Don't use the stack, because sp isn't set up.
volatile int wait = 1;
int main()
{
while (wait)
;
// Doesn't actually go on the stack, because there are lots of GPRs.
int i = 0;
while (text[i]) {
char lower = text[i] | 32;
if (lower >= 'a' && lower <= 'm')
text[i] += 13;
else if (lower > 'm' && lower <= 'z')
text[i] -= 13;
i++;
}
done:
while (!wait)
;
}
Чтобы отладить эту программу, сначала запустите spike, указав ему прослушивать OpenOCD:
$ spike --rbb-port=9824 -m0x10100000:0x20000 rot13-64
Listening for remote bitbang connection on port 9824.
В отдельной оболочке запустите OpenOCD с соответствующим файлом конфигурации:
adapter driver remote_bitbang
remote_bitbang host localhost
remote_bitbank port 9824
set _CHIPNAME riscv
jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0xdeadbeef
set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME riscv -chain-position $_TARGETNAME
gdb_report_data_abort enable
init
halt
Ещё в одной оболочке начните сеанс отладки gdb:
riscv64-unknown-elf-gdb rot13-64
GNU gdb (GDB) 8.0.50.20170724-git
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO
``` ГАРАНТИЯ, в рамках, разрешённых законом. Для получения подробной информации введите «show copying» и «show warranty».
Этот GDB был настроен как «--host=x86_64-pc-linux-gnu --target=riscv64-unknown-elf». Для получения сведений о конфигурации введите «show configuration».
Инструкции по сообщению об ошибках можно найти здесь:
<http://www.gnu.org/software/gdb/bugs/>.
Руководство по GDB и другие ресурсы документации доступны онлайн по адресу:
<http://www.gnu.org/software/gdb/documentation/>.
Для получения помощи введите «help».
Введите «apropos word», чтобы выполнить поиск команд, связанных со словом «word»...
Чтение символов из rot13-64...готово.
(gdb) target remote localhost:3333
Удаленная отладка с использованием localhost:3333.
0x0000000010010004 в main () в rot13.c:8
8 while (wait)
(gdb) print wait
$1 = 1
(gdb) print wait=0
$2 = 0
(gdb) print text
$3 = "Vafgehpgvba frgf jnag gb or serr!"
(gdb) b done
Точка останова 1 на 0x10110064: файл rot13.c, строка 22.
(gdb) c
Продолжение.
Отключение абстрактных команд записи в CSRs.
Точка останова 1, main () в rot13.c:23
23 while (!wait)
(gdb) print wait
$4 = 0
(gbd) print text
...
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )