UART связь в Gem5 с ARM Bare-metal

В настоящее время я работаю с Gem5, и мне нужно получить доступ через UART с моего хоста к ARMv8 с опцией «голый металл», так что я много пробовал, но все же запасся.

Не могли бы вы, пожалуйста, дайте мне знать, как я могу сопоставить последовательный порт моего хоста с последовательным портом ARMv8 в программировании типа «голый металл».

Любая помощь будет оценена

2

Решение

Рабочие настройки

Попробуйте это. Особенности:

  • работает как на QEMU, так и на gem5
  • работает как на руку, так и на aarch64
  • newlib позволяет дополнительно использовать стандартную библиотеку C
  • полухостинг
  • работает на обоих RealViewPBX а также VExpress_GEM5_V1, Вы должны предпочесть VExpress_GEM5_V1 как это более современная платформа.
  • нетронутая цепочка инструментов, построенная с помощью Crosstool-NG

Ключевые моменты реализации описаны ниже.

https://github.com/tukl-msd/gem5.bare-metal содержит другую рабочую настройку и является более минимальной, но в настоящее время имеет меньше возможностей.

рука

Для ARM нет ничего особенного, вам просто нужно узнать адрес UART и адрес точки входа, точно так же, как для QEMU.

Адрес UART можно найти в исходном коде gem5 src/dev/arm/RealView.py:

class RealViewPBX(RealView):
uart = Pl011(pio_addr=0x10009000, int_num=44)

class VExpress_GEM5_V1(RealView):
uart0 = Pl011(pio_addr=0x1c090000, int_num=37)

Точка входа выводится непосредственно из ELF, но некоторые значения TODO недопустимы. Я просто шаг отлажен, пока не нашел эти значения:

    if common.machine == 'VExpress_GEM5_V1':
entry_address = 0x80000000
elif common.machine == 'RealViewPBX':
entry_address = 0x10000

aarch64

Похожий на arm, но требует нескольких дополнительных шагов.

Сначала вы должны собрать свой набор инструментов самостоятельно, если вы хотите Newlib, так как Ubuntu не имеет пакета aarch64. Я адаптировал существующую конфигурацию руки и достиг этот рабочий конфиг.

Затем, начиная с 6fa49382ef22e1b01fb24503e3bbe5ab3556750a, вы должны передать параметры CLI:

fs.py --param 'system.highest_el_is_64 = True' \
--param 'system.auto_reset_addr = True'

(auto_reset_addr_64 до 6fa49382ef22e1b01fb24503e3bbe5ab3556750a) в противном случае происходит сбой:

fatal: Kernel is mapped to invalid location (not memory). kernelStart 0x(400000) - kernelEnd 0x(0) 0x400000:0

Другой ключевой патч: https://github.com/gem5/gem5/commit/3c3ca64b5f0dd9eef7b1ce1c65cc6e8e9147dd38

В качестве альтернативы, вы также можете исправить fs.py как:

diff --git a/configs/example/fs.py b/configs/example/fs.py
index 3997ed76c..286e0bca6 100644
--- a/configs/example/fs.py
+++ b/configs/example/fs.py
@@ -376,5 +376,9 @@ if buildEnv['TARGET_ISA'] == "arm" and options.generate_dtb:
sys = getattr(root, sysname)
sys.dtb_filename = create_dtb_for_system(sys, '%s.dtb' % sysname)

+from m5.objects import ArmSemihosting
+test_sys.semihosting = ArmSemihosting()
+test_sys.highest_el_is_64 = True
+test_sys.auto_reset_addr_64 = True
Simulation.setWorkCountOptions(test_sys, options)
Simulation.run(options, root, test_sys, FutureClass)

Часть полухостинга необязательна, но супер удобна, см .: Как включить ARM полухостинг в gem5? Другие варианты являются обязательными.

Протестировано в Ubuntu 18.04 на хосте.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector