| SIM port for the OpenRISC architecture |
| |
| Authors: Stafford Horne <shorne@gmail.com> |
| Peter Gavin |
| |
| # Guide to Code # |
| |
| We have tried to comment on the functions in the simulator implementation as |
| best as we can. Here we provide some general architecture comments for |
| reference. Please let me know if there is a better place for these kind of |
| docs. |
| |
| The or1k sim uses the CGEN system to generate most of the simulator code. There |
| is some documentation for CGEN on sourceware.org here: |
| |
| https://sourceware.org/cgen/docs/cgen.html |
| |
| In the binutils-gdb project there are several files which get combined to make |
| up the CGEN simulator. The process for how those are built can be seen in |
| `or1k/Makefile.in`. But the main files are: |
| |
| MAIN |
| sim/common/nrun.c - the main() calls sim_open(), sim_resume() and others |
| sim/or1k/sim-if.c - implements sim_open() and others used by nrun |
| when envoking sim in gdb, gdb uses sim_open() directly |
| |
| CGEN input and generated files |
| cpu/or1k*.cpu - these define the hardware, model and semantics |
| sim/or1k/arch.c - generated defines sim_machs array |
| sim/or1k/cpu.c - *generated defines register setters and getters |
| sim/or1k/decode.c - generated defines instruction decoder |
| sim/or1k/model.c - generated defines instruction cycles |
| sim/or1k/sem.c - *generated defines instruction operation semantics |
| sim/or1k/sem-switch.c - *generated ditto but as a switch |
| |
| ENGINE runs decode execute loop |
| sim/common/cgen-* - cgen implementation helpers |
| sim/common/cgen-run.c - implements sim_resume() which runs the engine |
| sim/common/genmloop.sh - helper script to generate mloop.c engine the |
| decode, execute loop |
| sim/or1k/mloop.in - openRISC implementation of mloop parts |
| |
| EXTRAS callbacks from sem* to c code |
| sim/or1k/or1k.c - implements some instructions in c (not cgen schema) |
| sim/or1k/traps.c - exception handler |
| |
| For each sim architecture we have choices for how the mloop is implemented. The |
| OpenRISC engine uses scache pbb (pseudo-basic-block) instruction extraction with |
| both fast (sem-switch.c based) and full (sem.c based) implementations. The fast |
| and full modes are switch via the command line options to the `run` command, |
| i.e. --trace-insn will run in full mode. |
| |
| # Building # |
| |
| Below are some details on how we build and test the openrisc sim. |
| |
| ## TOOLCHAIN ## |
| |
| This may not be needed as binutils contains most/all of the utilities required. |
| But if needed, get this toolchain (this is the newlib binary, others also |
| available) |
| |
| https://github.com/openrisc/or1k-gcc/releases/download/or1k-5.4.0-20170218/or1k-elf-5.4.0-20170218.tar.xz |
| |
| If you want to build that from scratch look to: |
| |
| https://github.com/openrisc/newlib/blob/scripts/build.sh |
| |
| ## GDB ## |
| |
| In a directory along side binutils-gdb source |
| |
| mkdir build-or1k-elf-gdb |
| cd build-or1k-elf-gdb |
| |
| ../binutils-gdb/configure --target=or1k-elf \ |
| --prefix=/opt/shorne/software/or1k \ |
| --disable-itcl \ |
| --disable-tk \ |
| --disable-tcl \ |
| --disable-winsup \ |
| --disable-gdbtk \ |
| --disable-libgui \ |
| --disable-rda \ |
| --disable-sid \ |
| --with-sysroot \ |
| --disable-newlib \ |
| --disable-libgloss \ |
| --disable-gas \ |
| --disable-ld \ |
| --disable-binutils \ |
| --disable-gprof \ |
| --with-system-zlib |
| |
| # make gdb, sim |
| make |
| |
| # test sim |
| cd sim |
| make check |
| |
| The sim creates a binary simulator too, you can run binaries such as hello |
| world with: |
| |
| or1k-elf-gcc hello.c |
| ./or1k/run --trace-insn ./a.out |
| |