A few months ago, I came to the conclusion that it would be both fun and educational to add a new disassembler backend to libdisasm—the disassembler library in Illumos. Being a mainframe fan, I decided that implementing a System/390 and z/Architecture disassembler would be fun (I’ve done it before in HVF).
At first, I was targetting only the 390 and z/Architecture, but given that the System/370 is a trivial (almost) subset of the 390 (and there is a spec for 370 ELF files!), I ended up including the 370 support as well.
It took a while to get the code written (z/Architecture has so many instructions!) and reviewed, but it finally happened… the commit just landed in the repository.
If you get the latest Illumos bits, you’ll be able to disassemble 370, 390, and z/Architecture binaries with style. For example:
$ dis -F strcmp hvf disassembly for hvf strcmp() strcmp: a7 19 00 00 lghi %r1,0 strcmp+0x4: a7 f4 00 08 j 0x111aec strcmp+0x8: a7 1b 00 01 aghi %r1,1 strcmp+0xc: b9 02 00 55 ltgr %r5,%r5 strcmp+0x10: a7 84 00 17 je 0x111b16 strcmp+0x14: e3 51 20 00 00 90 llgc %r5,0(%r1,%r2) strcmp+0x1a: e3 41 30 00 00 90 llgc %r4,0(%r1,%r3) strcmp+0x20: 18 05 lr %r0,%r5 strcmp+0x22: 1b 04 sr %r0,%r4 strcmp+0x24: 18 40 lr %r4,%r0 strcmp+0x26: a7 41 00 ff tmll %r4,255 strcmp+0x2a: a7 84 ff ef je 0x111ae0 strcmp+0x2e: 18 20 lr %r2,%r0 strcmp+0x30: 89 20 00 18 sll %r2,%r0,24(%r0) strcmp+0x34: 8a 20 00 18 sra %r2,%r0,24(%r0) strcmp+0x38: b9 14 00 22 lgfr %r2,%r2 strcmp+0x3c: 07 fe br %r14 strcmp+0x3e: a7 28 00 00 lhi %r2,0 strcmp+0x42: b9 14 00 22 lgfr %r2,%r2 strcmp+0x46: 07 fe br %r14
I am hoping that this will help document all the places needed to change when adding support for a new ISA to libdisasm.