该项目旨在便捷的创建 la32r 架构的裸机 C 程序及汇编程序。
目录组织:
am/:AM头文件、每个体系结构分别实现的AM代码libs/:建立在AM上、体系结构无关的运行库,如软件模拟浮点数、基础 libc 功能等apps/:一些 benchmark,如 coremark,dhrystone,linuxtests/: 用来测试 CPU/SoC 实现的测试程序
设置环境变量:环境变量AM_HOME需要设置为 am 项目的根目录的绝对路径,如 /home/am。
- 设置 la32r 编译器与库的环境变量:将
loongarch32r-linux-gnusf-2022-05-20与system_newlib放在一个文件夹la32r-toolchains下,并将$LA32RTC_HOME环境变量设置为la32r-toolchains目录。
├── la32r-toolchains
│ ├── loongarch32r-linux-gnusf-2022-05-20
│ └── system_newlib
编译时,首先确保环境变量是否正确设置,然后执行make ARCH=体系结构-平台编译。例如make ARCH=la32r-eula 编译生成可在 chiplab 及 difftest 仿真环境中运行的裸机程序。
- 注意:在
$AM_HOME下make只会生成 am 的 archive 文件,在 ,tests或apps下文件夹中make才会生成对应程序的 elf,bin 及反汇编文件
程序用C/C++语言编写,除AM之外无法调用其他库函数(但可以引用stdarg.h, limits.h等包含体系结构相关数据定义的头文件)。
为此你需要在应用程序项目的根目录添加一个Makefile(以 apps/coremark 为例):
NAME = coremark
SRCS = $(shell find -L ./src/ -name "*.c")
include $(AM_HOME)/Makefile.app
一些注意事项:
-
NAME定义了应用的名字。编译后会在build/目录里出现以此命名的应用程序 -
SRCS指定了编译应用所需的源文件。可以放在应用目录中的任意位置 -
应用目录下的
include/目录会被添加到编译的-I选项中
Makefile 编写及文件夹结构请参考 tests/cputest
chiplab 框架需要参考这个 commit 修改。然后在 $CHIPLAB_HOME/sims/verilator/run_prog 目录下执行 ./configure.sh --run ext_prog,make EXTPROG=$AM_HOME/apps/coremark/build/coremark-la32r-eula.vlog 就可以执行 am 编译出的 coremark 程序。
一般情况下所有程序共用 ARCH 指定的编译命令,链接脚本及初始化代码。以 ARCH=la32r-eula 为例,cpu 复位后指令流为:
am/src/eula/isa/la32r/boot/start.S // 初始化栈指针
am/src/eula/isa/la32r/trm.c : _trm_init // 初始化外设,初始化缓存,建立地址空间映射等
执行对应程序 main 函数
返回 _trm_init 执行 halt 函数结束仿真
- 目前在
halt函数中尝试使用syscall 0x11指令结束程序运行。运行 AM 程序的目标平台应当支持此种方法(la32r-nemu 支持,因此使用 la32r-nemu 协同仿真的 difftest 框架及 chiplab 框架均支持此方法)。