<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>J's BS</title><link href="https://jan.nlogn.org/jsbs/" rel="alternate"/><link href="https://jan.nlogn.org/jsbs/feeds/all.atom.xml" rel="self"/><id>https://jan.nlogn.org/jsbs/</id><updated>2026-10-10T00:00:00+02:00</updated><subtitle>Subtitle</subtitle><entry><title>Papers and Patents about LTO drives</title><link href="https://jan.nlogn.org/jsbs/papers-and-patents-about-lto-drives.html" rel="alternate"/><published>2026-10-10T00:00:00+02:00</published><updated>2026-10-10T00:00:00+02:00</updated><author><name>Jan M. Binder</name></author><id>tag:jan.nlogn.org,2026-10-10:/jsbs/papers-and-patents-about-lto-drives.html</id><summary type="html">&lt;p&gt;Papers, please!&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Publications in scientific and engineering journals&lt;/h1&gt;
&lt;p&gt;IBM Research wrote a nice article about the technology behind LTO drives and published it OA/CC-BY 4.0:&lt;/p&gt;
&lt;p&gt;&lt;a href="pdf/IBM-magnetic-tape-storage-technology_ACM-Trans.Storage_3708997.pdf"&gt;Magnetic Tape Storage Technology&lt;/a&gt;
MARK A. LANTZ et al.
ACM Trans. Storage, Vol. 21, No. 1, Article 6. January 2025.&lt;/p&gt;
&lt;p&gt;Frame Synchronization for PPM-encoded Longitudinal Position Words in Magnetic Tape Storage, 
Giovanni Cherubini, Roy D. Cideciyan, Evangelos Eleftheriou, and Jens Jelitto
IEEE "GLOBECOM" 2009 proceedings.&lt;/p&gt;
&lt;h1&gt;Patents&lt;/h1&gt;</content><category term="Link collections"/><category term="lto"/><category term="publications"/></entry><entry><title>Useful Links about LTO drives</title><link href="https://jan.nlogn.org/jsbs/useful-links-about-lto-drives.html" rel="alternate"/><published>2026-10-10T00:00:00+02:00</published><updated>2026-10-10T00:00:00+02:00</updated><author><name>Jan M. Binder</name></author><id>tag:jan.nlogn.org,2026-10-10:/jsbs/useful-links-about-lto-drives.html</id><summary type="html">&lt;p&gt;Others have published how these drives are constructed and how to use them that the manufacturers did not and some of the useful original documentation.&lt;/p&gt;</summary><content type="html">&lt;p&gt;My browser needs to have fewer tabs open, so I'm putting them here.&lt;/p&gt;
&lt;h1&gt;Usage&lt;/h1&gt;
&lt;p&gt;Introduction into LTO on Linux
&lt;a href="https://blog.benjojo.co.uk/post/lto-tape-backups-for-linux-nerds"&gt;LTO Tape data storage for Linux nerds&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Using tar for its original purpose
&lt;a href="https://www.cyberciti.biz/faq/linux-tape-backup-with-mt-and-tar-command-howto/"&gt;Linux Tape Backup With mt And tar Command Howto&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Library (de-) integration&lt;/h1&gt;
&lt;p&gt;IBM library tape drive to standalone reconfiguration (HP-style drives sense a connected library automatically)
&lt;a href="https://github.com/AC7RNsphnHVbyT4/ibm-tape-drive-automatic-standalone?tab=readme-ov-file"&gt;How to turn an IBM Drive into automatic standalone mode&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;MSL2024, drive ADI/LDI connector, fans &amp;amp; noise management
&lt;a href="https://mrmelair.com/2023/06/29/adventures-in-lto-tape-drives/"&gt;Adventures in LTO Tape Drives&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Service password for Library &amp;amp; OOBMGMT
&lt;a href="https://www.nest.org.ru/2022/04/oob-hpe-msl-cli/"&gt;Out-of-Band management MSL2024/4048/SL24/SL48&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;(Dis-) Assembly&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://crecimiento-sostenible.blogspot.com/2015/03/repairing-tape-backup-lto-2-unit-hp.html"&gt;Repairing a tape backup LTO 2 unit: HP Ultrium 448 with broken tape&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://sbfmdrv.blogspot.com/2018/11/disassembling-and-cleaning-lto-tape.html"&gt;Disassembling and cleaning an LTO tape drive head (HP mechanism)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://stephane.lesimple.fr/blog/repairing-a-faulty-hp-storageworks-ultrium-460-tape-drive/"&gt;Disassembling an HP Ultrium 460 tape drive head&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Full teardown:
&lt;a href="https://mysku.club/blog/ebay/93792.html"&gt;IBM LTO-4 ленточный привод: разбираю на атомы.&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Tape formats&lt;/h1&gt;
&lt;p&gt;Tape encryption and compression formats/algorithms, raw reading
&lt;a href="https://darkimmortal.com/the-secrets-of-lto-tape/"&gt;The secrets of LTO tape&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you buy used tapes anf old equipment, sometimes there are free tapes with free data
&lt;a href="https://www.108.bz/posts/it/recovering-ntbackup-tapes/"&gt;Recovering NTBackup Tapes&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Tools&lt;/h1&gt;
&lt;p&gt;Unknown quality here&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/LinearTapeFileSystem/ltfs"&gt;Linear Tape File System (LTFS)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pojntfx/stfs"&gt;Simple Tape File System (STFS)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/samuelncui/yatm"&gt;YATM aka Yet Another Tape Manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/adamlamers/tapehoard"&gt;TapeHoard - Physical media archival for people who don't trust the cloud alone. &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/markh794/mhvtl"&gt;mhvtl: A Virtual Tape &amp;amp; Library system.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/NotARaptor/FOSSILSAFE"&gt;FossilSafe - open-source tool for managing LTO tape backups&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/HuskHoard/HuskHoard"&gt;HuskHoard - open source data tiering archive&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/speed47/lto-info"&gt;LTO Tape Info Tool (uses tape drive)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/arogge/maminfo"&gt;maminfo (tape info from tape drive)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/scsitape/stenc"&gt;SCSI Tape Encryption Manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lukefor/ltoex"&gt;ltoex - LTO Ultrium tape AES-GCM decryption and SLDC decompression&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nvsofts/ltocapacity"&gt;ltocapacity - "Tape Capacity log page" viewer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/philpem/nfc-ltocm"&gt;LTO Cartridge Memory (LTO-CM / MAM) reader for libnfc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/Kevin-Nakamoto/LTO-CM-Analyzer"&gt;LTO-CM-Analyzer&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/uiscsi/tapeplayer"&gt;tapeplayer - play FLAC from SCSI tape drives&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Official documentation&lt;/h1&gt;
&lt;p&gt;IBM LTO7 HH drive, useful but not massively so
&lt;a href="https://docs.oracle.com/cd/E69343_01/en/lto7_hh_3580/lto7_hh_3580.pdf"&gt;Setup, Operator, and Service Guide Machine Type 3580 Model H7S&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dell TL2000/4000 manual with pictures and useful info about library components
&lt;a href="https://dl.dell.com/manuals/common/powervault_tl2000_tl4000_usersguide3en-us.pdf"&gt;Dell PowerVault TL2000 Tape Library and TL4000 Tape Library User's Guid&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;mt documentation from RHEL 10
&lt;a href="https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/10/html/managing_storage_devices/managing-tape-devices"&gt;Chapter 15. Managing tape devices&lt;/a&gt;&lt;/p&gt;</content><category term="Link collections"/><category term="lto"/></entry><entry><title>HPE-stlye firmware update package</title><link href="https://jan.nlogn.org/jsbs/hpe-stlye-firmware-update-package.html" rel="alternate"/><published>2026-10-09T00:00:00+02:00</published><updated>2026-10-09T00:00:00+02:00</updated><author><name>Jan M. Binder</name></author><id>tag:jan.nlogn.org,2026-10-09:/jsbs/hpe-stlye-firmware-update-package.html</id><summary type="html">&lt;p&gt;Unified HP container for update files&lt;/p&gt;</summary><content type="html">&lt;h1&gt;HP header&lt;/h1&gt;
&lt;h2&gt;LTO3&lt;/h2&gt;
&lt;p&gt;NEC/Renesas V850&lt;/p&gt;
&lt;h2&gt;LTO4&lt;/h2&gt;
&lt;p&gt;32bit LE ARM (arm v5t)&lt;/p&gt;
&lt;h2&gt;LTO5&lt;/h2&gt;
&lt;p&gt;32bit LE ARM Cortex&lt;/p&gt;</content><category term="Reverse engineering"/><category term="re"/><category term="software"/><category term="lto"/></entry><entry><title>MG Electronics / Clack Corp 15V power supply</title><link href="https://jan.nlogn.org/jsbs/mg-electronics-clack-corp-15v-power-supply.html" rel="alternate"/><published>2026-10-04T00:00:00+02:00</published><updated>2026-10-04T00:00:00+02:00</updated><author><name>Jan M. Binder</name></author><id>tag:jan.nlogn.org,2026-10-04:/jsbs/mg-electronics-clack-corp-15v-power-supply.html</id><summary type="html">&lt;p&gt;MG Electronics SL-150B005-EU, also sold as Clack Corporation V3286EU-06 with a failed diode&lt;/p&gt;</summary><content type="html">&lt;p&gt;The MG Electronics SL-150B005-EU, also sold as Clack Corporation V3286EU-06, is a 15V DC power supply with a long cable and a 4-pin 0.1in plug that is uesd to supply the Clack WS 1 control valve for water softening and filtration devices.&lt;/p&gt;
&lt;p&gt;The WS1 has a full bridge rectifier right after the power plug, so it should not be picky about AC, DC or polarity, here is the power plug pinout anyway:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pin&lt;/th&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;+15 V&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;shorted to pin 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;shorted to pin 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;GND&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img alt="Clack WS1 PCB" src="images/clack-ws1.jpg"&gt;&lt;/p&gt;
&lt;p&gt;The power supply is well constructed, enought isolation between primary and secondary side, well isolated transformer, correct capacitors, etc
&lt;img alt="Power supply PCB top side" src="images/V3286EU_pcb_top.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Nevertheless, the output rectification Schottky diode, type SS310FL (D7, lower left corner) had failed and was replaced with a SK310A (100V, 3A) Schottky diode.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Power supply PCB bottom side" src="images/V3286EU_pcb_bot.jpg"&gt;&lt;/p&gt;
&lt;p&gt;The case is glued, but has alignment pins in the corners. If they are not sheared off when cracking the case, the unit is easy to glue back together.&lt;/p&gt;</content><category term="Repair"/><category term="repair"/><category term="hardware"/></entry><entry><title>IBM LTO5 firmware</title><link href="https://jan.nlogn.org/jsbs/ibm-lto5-firmware.html" rel="alternate"/><published>2026-09-30T00:00:00+02:00</published><updated>2026-09-30T00:00:00+02:00</updated><author><name>Jan M. Binder</name></author><id>tag:jan.nlogn.org,2026-09-30:/jsbs/ibm-lto5-firmware.html</id><summary type="html">&lt;p&gt;the pre-Linux era of LTO, on similar hardware&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Update file sectioning&lt;/h1&gt;
&lt;p&gt;There is a global header and 3 discernable sections, the header is 0x30 bytes, the chunks are 0x30 - 0x2002f, 0x20030 - 0x4002f and 0x40030 - EOF @ 0x4c112.&lt;/p&gt;
&lt;p&gt;Section 2 looks like 2 sections, as the exact second half is pretty empty and contains a series chained headers across most of the mostly-zero part.&lt;/p&gt;
&lt;p&gt;Lots of header entries are duplicate, so there may be an A/B redundancy scheme going on.&lt;/p&gt;
&lt;p&gt;0x30030 - 0x4002f looks like its own section with its own encoding scheme, but it is included in the header of section 2.&lt;/p&gt;
&lt;p&gt;Section 3 has two flash to memory mapping tables at 0x200 and 0xA10, including duplicate reset vector descriptions and copyright notices.&lt;/p&gt;
&lt;h2&gt;summary&lt;/h2&gt;
&lt;p&gt;Section 1 contains a bootloader that does a little bit of setup and then jumps to the next stage.&lt;/p&gt;
&lt;p&gt;Section 2 is more elaborate, TBD.&lt;/p&gt;
&lt;p&gt;Section 3 is the "application" section, lots of code, complicated memory map and debug output strings for tape drive setup and debugging.
Most of its subsections are LZW-compressed.&lt;/p&gt;
&lt;h1&gt;Memory/flash maps&lt;/h1&gt;
&lt;h3&gt;mem map&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: right;"&gt;offset&lt;/th&gt;
&lt;th style="text-align: right;"&gt;size&lt;/th&gt;
&lt;th&gt;description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;100 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td&gt;a peripheral ?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;FFC 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td&gt;32MiB boot flash?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;1000 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;400 0000&lt;/td&gt;
&lt;td&gt;64 MiB SDRAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;a000 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td&gt;OPB bus controller ?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;ef00 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td&gt;peripherals  ?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;ef60 0300&lt;/td&gt;
&lt;td style="text-align: right;"&gt;8&lt;/td&gt;
&lt;td&gt;N16550 serial controller&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;fe00 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;200 0000&lt;/td&gt;
&lt;td&gt;32 MiB NOR flash, maype upper part of 0xf800 128MiB NOR like later&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;ffff fffc&lt;/td&gt;
&lt;td style="text-align: right;"&gt;4&lt;/td&gt;
&lt;td&gt;PPC reset vector&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;flash map from application section header&lt;/h3&gt;
&lt;p&gt;There are two flash maps, the uncompressed image stored at 0xFE00_0000, where stored size and offsets match memory target size, and the compressed image stored at 0xFE80_0000 where the stored size is smaller than the target memory size.&lt;/p&gt;
&lt;p&gt;The headers for both are very similar, only stored addresses and sizes differ besides a small extra block of extra info about stored-only sections in the compressed image header.&lt;/p&gt;
&lt;p&gt;This is the compresed flash map:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: right;"&gt;file offset&lt;/th&gt;
&lt;th style="text-align: right;"&gt;stored size&lt;/th&gt;
&lt;th style="text-align: right;"&gt;mem offset&lt;/th&gt;
&lt;th style="text-align: right;"&gt;mem size&lt;/th&gt;
&lt;th&gt;description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;fe80 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;800&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td&gt;header&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;fe80 0800&lt;/td&gt;
&lt;td style="text-align: right;"&gt;32 1F25&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1020 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;42 A63C&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;feb2 2730&lt;/td&gt;
&lt;td style="text-align: right;"&gt;8 1AEF&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1070 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;D 7AC4&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;feba 4220&lt;/td&gt;
&lt;td style="text-align: right;"&gt;4 146A&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1080 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;8 CC58&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;febe 5690&lt;/td&gt;
&lt;td style="text-align: right;"&gt;2 D097&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1014 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;3 AA74&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;fec1 2730&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1FF8&lt;/td&gt;
&lt;td style="text-align: right;"&gt;100 8000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;3744&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;fec1 4730&lt;/td&gt;
&lt;td style="text-align: right;"&gt;229&lt;/td&gt;
&lt;td style="text-align: right;"&gt;100 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;298&lt;/td&gt;
&lt;td&gt;system configuration block&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;fec1 4960&lt;/td&gt;
&lt;td style="text-align: right;"&gt;A BE90&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;fecc 07f0&lt;/td&gt;
&lt;td style="text-align: right;"&gt;110&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;fe7f f7f0&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1088 D000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;12E2 CF44&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;100 0400&lt;/td&gt;
&lt;td style="text-align: right;"&gt;100 39E0&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;12F0 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;137B 4EB0&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;100 3C00&lt;/td&gt;
&lt;td style="text-align: right;"&gt;100 3C20&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;memory map from TLB setup&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: right;"&gt;device end&lt;/th&gt;
&lt;th style="text-align: right;"&gt;device start&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;fe00 03c0&lt;/td&gt;
&lt;td style="text-align: right;"&gt;fe00 0005&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;ff00 03c0&lt;/td&gt;
&lt;td style="text-align: right;"&gt;ff00 0005&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;7000 0040&lt;/td&gt;
&lt;td style="text-align: right;"&gt;7000 0105&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;a000 03c0&lt;/td&gt;
&lt;td style="text-align: right;"&gt;a000 0105&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;b000 03c0&lt;/td&gt;
&lt;td style="text-align: right;"&gt;b000 0105&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;ef60 0340&lt;/td&gt;
&lt;td style="text-align: right;"&gt;ef60 0105&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;100 0140&lt;/td&gt;
&lt;td style="text-align: right;"&gt;100 0104&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;100 4140&lt;/td&gt;
&lt;td style="text-align: right;"&gt;100 4104&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;100 8140&lt;/td&gt;
&lt;td style="text-align: right;"&gt;100 8104&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;ffc 0240&lt;/td&gt;
&lt;td style="text-align: right;"&gt;ffc 0204&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;1014 0240&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1014 0000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: right;"&gt;ram start&lt;/th&gt;
&lt;th style="text-align: right;"&gt;ram end&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;1020 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1070 0000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;1070 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1080 0000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;1080 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;12e4 0000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;12f0 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1380 0000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;1380 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;13ec 0000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;13ec 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;13f0 0000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;1000 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1000 4000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;1000 4000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1000 8000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;1000 8000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1000 c000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;1000 c000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1001 0000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;1001 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1001 c000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;1001 c000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1002 0000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;1002 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1014 0000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: right;"&gt;device end&lt;/th&gt;
&lt;th style="text-align: right;"&gt;device start&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;4000 03c0&lt;/td&gt;
&lt;td style="text-align: right;"&gt;4000 0105&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;100 09b0&lt;/td&gt;
&lt;td style="text-align: right;"&gt;100 09b4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</content><category term="Reverse engineering"/><category term="re"/><category term="software"/><category term="lto"/></entry><entry><title>LTO firmware across the ages</title><link href="https://jan.nlogn.org/jsbs/lto-firmware-across-the-ages.html" rel="alternate"/><published>2026-09-24T00:00:00+02:00</published><updated>2026-09-24T00:00:00+02:00</updated><author><name>Jan M. Binder</name></author><id>tag:jan.nlogn.org,2026-09-24:/jsbs/lto-firmware-across-the-ages.html</id><summary type="html">&lt;p&gt;What has changed from 2012 to 2025? (or longer)&lt;/p&gt;</summary><content type="html">&lt;h1&gt;LTO5&lt;/h1&gt;
&lt;p&gt;This one has a completely different firmware image format from its successors, it is not based on embedded Linux yet, but it is an embedded PowerPC processor with a similar memory layout.&lt;/p&gt;
&lt;p&gt;There are 2 distinct firmware sections like the later fcod/pcod and a large application section with LZW compressed data.&lt;/p&gt;
&lt;h1&gt;LTO6-9 - 4 Generations of similar firmware&lt;/h1&gt;
&lt;p&gt;As a long-lived business product, IBM's LTO drive firmware has not changed much since LTO6 drives came out, LTO10 marks the first firmware image format change.
This is despite substantial changes to the tape, tape heads and storage interfaces which &lt;a href="https://en.wikipedia.org/wiki/Linear_Tape-Open"&gt;Wikipedia&lt;/a&gt; summarizes nicely.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Serial_Attached_SCSI"&gt;SAS&lt;/a&gt; drive firmwares are consistently a little smaller (50 kiB) than their &lt;a href="https://en.wikipedia.org/wiki/Fibre_channel"&gt;FC&lt;/a&gt; counterparts due to their smaller kernel and initrd.&lt;/p&gt;
&lt;p&gt;The memory layout as specified in the firmware update header is identical from LTO6 to LTO9, only the sizes of some sections change slightly, mostly the Linux image &lt;strong&gt;vmli&lt;/strong&gt; and its initrd &lt;strong&gt;ramf&lt;/strong&gt; which grow slightly with each new generation.&lt;/p&gt;
&lt;p&gt;For the LTO7 generation, it seems like &lt;a href=""&gt;HPE&lt;/a&gt; gave up on their own tape machanism and their firmare updates are now a wrapper around an IBM firmware image.&lt;/p&gt;
&lt;h1&gt;LTO10 - big changes in hardware, small changes in firmware&lt;/h1&gt;
&lt;p&gt;LTO10 (aka LTOA) moves the memory layout around, instead of starting at 0x10000000 with &lt;strong&gt;kmem&lt;/strong&gt;, firmware now starts at 0x90000000, though section order stays largely the same and relative offsets change very little.&lt;/p&gt;
&lt;p&gt;It also introduces a new 0x180-byte section called &lt;strong&gt;csm&lt;/strong&gt; at 0x9FFC0000 and the &lt;strong&gt;ocmd&lt;/strong&gt; section (presumably flash control) moves from 0x06000000 to 0xD0000000 and shrinks from 0x104 to 0x4.&lt;/p&gt;
&lt;p&gt;The global and &lt;strong&gt;pcod&lt;/strong&gt; header magic string is changed to &lt;strong&gt;IBMTpDrA&lt;/strong&gt; to prevent issues when updating.&lt;/p&gt;
&lt;p&gt;These changes are necessitated by IBM switching from their embedded PowerPC platform to a Synopsys &lt;strong&gt;ARCv2 HS38&lt;/strong&gt; processor, which is a synthesizable 32-bit RISC core design now owned by MIPS owned by Global Foundries;
peripherals are expected to be mostly from the Synopsys DesignWare catalog.
For a complete change of processor architecture and peripherals, surprisingly little has changed in the firmware image.&lt;/p&gt;</content><category term="Reverse engineering"/><category term="re"/><category term="software"/><category term="lto"/></entry><entry><title>IBM LTO8 memory map</title><link href="https://jan.nlogn.org/jsbs/ibm-lto8-memory-map.html" rel="alternate"/><published>2026-09-23T00:00:00+02:00</published><updated>2026-09-23T00:00:00+02:00</updated><author><name>Jan M. Binder</name></author><id>tag:jan.nlogn.org,2026-09-23:/jsbs/ibm-lto8-memory-map.html</id><summary type="html">&lt;p&gt;memory map&lt;/p&gt;</summary><content type="html">&lt;h3&gt;Combined mmap&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: right;"&gt;Phys addr&lt;/th&gt;
&lt;th style="text-align: right;"&gt;size&lt;/th&gt;
&lt;th style="text-align: left;"&gt;name&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;0600 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;104&lt;/td&gt;
&lt;td style="text-align: left;"&gt;fcod ocmd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;0600 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;100&lt;/td&gt;
&lt;td style="text-align: left;"&gt;pcod ocmb&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;0600 0100&lt;/td&gt;
&lt;td style="text-align: right;"&gt;4&lt;/td&gt;
&lt;td style="text-align: left;"&gt;pcod ocmd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;07FD 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;4&lt;/td&gt;
&lt;td style="text-align: left;"&gt;pcod ocmt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;1000 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;A0 0000&lt;/td&gt;
&lt;td style="text-align: left;"&gt;fcod kmem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;10A0 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;4820&lt;/td&gt;
&lt;td style="text-align: left;"&gt;fcod&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;10B0 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;19 B544&lt;/td&gt;
&lt;td style="text-align: left;"&gt;vmli&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;10D0 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;4A 1678&lt;/td&gt;
&lt;td style="text-align: left;"&gt;ramf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;1120 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;2 0000&lt;/td&gt;
&lt;td style="text-align: left;"&gt;pcod&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;1122 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1230&lt;/td&gt;
&lt;td style="text-align: left;"&gt;fcod text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;1130 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;744&lt;/td&gt;
&lt;td style="text-align: left;"&gt;fcod roda&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;1130 0744&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1E1C&lt;/td&gt;
&lt;td style="text-align: left;"&gt;fcod vmal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;1140 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;4&lt;/td&gt;
&lt;td style="text-align: left;"&gt;fcod data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;1150 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;61 001C&lt;/td&gt;
&lt;td style="text-align: left;"&gt;fcod bss&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;11A0 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;3250&lt;/td&gt;
&lt;td style="text-align: left;"&gt;pcod text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;11A1 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;F5C&lt;/td&gt;
&lt;td style="text-align: left;"&gt;pcod roda&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;11A2 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;4&lt;/td&gt;
&lt;td style="text-align: left;"&gt;pcod data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;11A3 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;2010&lt;/td&gt;
&lt;td style="text-align: left;"&gt;pcod bss&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;11C0 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1 0000&lt;/td&gt;
&lt;td style="text-align: left;"&gt;fcod stac&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;a000 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;6000 0000&lt;/td&gt;
&lt;td style="text-align: left;"&gt;linux opb&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;a000 0600&lt;/td&gt;
&lt;td style="text-align: right;"&gt;100&lt;/td&gt;
&lt;td style="text-align: left;"&gt;linux irq ctrl&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;ef60 0300&lt;/td&gt;
&lt;td style="text-align: right;"&gt;8&lt;/td&gt;
&lt;td style="text-align: left;"&gt;linux serial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;ef60 0790&lt;/td&gt;
&lt;td style="text-align: right;"&gt;c&lt;/td&gt;
&lt;td style="text-align: left;"&gt;linux rgmii&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;ef60 0800&lt;/td&gt;
&lt;td style="text-align: right;"&gt;70&lt;/td&gt;
&lt;td style="text-align: left;"&gt;linux ethernet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;F800 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;800 0000&lt;/td&gt;
&lt;td style="text-align: left;"&gt;linux flash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;FFFE 0000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;2DD0&lt;/td&gt;
&lt;td style="text-align: left;"&gt;pcod (pcod)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;FFFF FFFC&lt;/td&gt;
&lt;td style="text-align: right;"&gt;4&lt;/td&gt;
&lt;td style="text-align: left;"&gt;pcod rese&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;fcod mmap&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phys addr&lt;/th&gt;
&lt;th&gt;size&lt;/th&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0600 0000&lt;/td&gt;
&lt;td&gt;104&lt;/td&gt;
&lt;td&gt;ocmd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000 0000&lt;/td&gt;
&lt;td&gt;A0 0000&lt;/td&gt;
&lt;td&gt;kmem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10A0 0000&lt;/td&gt;
&lt;td&gt;4820&lt;/td&gt;
&lt;td&gt;fcod&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10B0 0000&lt;/td&gt;
&lt;td&gt;19 B544&lt;/td&gt;
&lt;td&gt;vmli&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10D0 0000&lt;/td&gt;
&lt;td&gt;4A 1678&lt;/td&gt;
&lt;td&gt;ramf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1120 0000&lt;/td&gt;
&lt;td&gt;2 0000&lt;/td&gt;
&lt;td&gt;pcod&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1122 0000&lt;/td&gt;
&lt;td&gt;1230&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1130 0000&lt;/td&gt;
&lt;td&gt;744&lt;/td&gt;
&lt;td&gt;roda&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1130 0744&lt;/td&gt;
&lt;td&gt;1E1C&lt;/td&gt;
&lt;td&gt;vmal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1140 0000&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1150 0000&lt;/td&gt;
&lt;td&gt;61 001C&lt;/td&gt;
&lt;td&gt;bss&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11C0 0000&lt;/td&gt;
&lt;td&gt;1 0000&lt;/td&gt;
&lt;td&gt;stac&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ef60 0300&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;serial&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;pcod mmap&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phys addr&lt;/th&gt;
&lt;th&gt;size&lt;/th&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0600 0000&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;ocmb&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0600 0100&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;ocmd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;07FD 0000&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;ocmt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000 0000&lt;/td&gt;
&lt;td&gt;A0 0000&lt;/td&gt;
&lt;td&gt;fcod kmem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10A0 0000&lt;/td&gt;
&lt;td&gt;4820&lt;/td&gt;
&lt;td&gt;fcod&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10B0 0000&lt;/td&gt;
&lt;td&gt;19 B544&lt;/td&gt;
&lt;td&gt;vmli&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10D0 0000&lt;/td&gt;
&lt;td&gt;4A 1678&lt;/td&gt;
&lt;td&gt;ramf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1120 0000&lt;/td&gt;
&lt;td&gt;2 0000&lt;/td&gt;
&lt;td&gt;pcod&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1122 0000&lt;/td&gt;
&lt;td&gt;1230&lt;/td&gt;
&lt;td&gt;fcod text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1130 0000&lt;/td&gt;
&lt;td&gt;744&lt;/td&gt;
&lt;td&gt;fcod roda&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1130 0744&lt;/td&gt;
&lt;td&gt;1E1C&lt;/td&gt;
&lt;td&gt;fcod vmal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1140 0000&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;fcod data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1150 0000&lt;/td&gt;
&lt;td&gt;61 001C&lt;/td&gt;
&lt;td&gt;fcod bss&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11A0 0000&lt;/td&gt;
&lt;td&gt;3250&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11A1 0000&lt;/td&gt;
&lt;td&gt;F5C&lt;/td&gt;
&lt;td&gt;roda&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11A2 0000&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11A3 0000&lt;/td&gt;
&lt;td&gt;2010&lt;/td&gt;
&lt;td&gt;bss&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ef60 0300&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;serial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FFFE 0000&lt;/td&gt;
&lt;td&gt;2DD0&lt;/td&gt;
&lt;td&gt;pcod&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FFFF FFFC&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;pcod rese&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</content><category term="Reverse engineering"/><category term="re"/><category term="software"/></entry><entry><title>Investigating IBM LTO tape drive firmware</title><link href="https://jan.nlogn.org/jsbs/investigating-ibm-lto-tape-drive-firmware.html" rel="alternate"/><published>2026-09-20T00:00:00+02:00</published><updated>2026-09-20T00:00:00+02:00</updated><author><name>Jan M. Binder</name></author><id>tag:jan.nlogn.org,2026-09-20:/jsbs/investigating-ibm-lto-tape-drive-firmware.html</id><summary type="html">&lt;p&gt;LTO8 tape drive firmware, embedded Linux, applicable to LTO6 to LTO9 IBM LTO drives&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Hardware&lt;/h1&gt;
&lt;p&gt;Processor is identified as a 400MHz IBM PowerPC 405S, 32-bit big-endian by the embedded devicetree file.&lt;/p&gt;
&lt;p&gt;132MiB of physical memory is mapped at 0x10000000.&lt;/p&gt;
&lt;p&gt;There is a PLB running at 200MHz hosting a DMA engine and the OPB.&lt;/p&gt;
&lt;p&gt;The OPB runs at 100MHz and claims any addresses &amp;gt; 0xA0000000 and the following devices live in this space:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pirq interrupt controller @ 0xA0000600&lt;/li&gt;
&lt;li&gt;n16550 serial controller @ 0xEF600300&lt;/li&gt;
&lt;li&gt;axon ethernet rgmii @ 0xEF600790&lt;/li&gt;
&lt;li&gt;axon ethernet controller @ 0xEF600800&lt;/li&gt;
&lt;li&gt;128MiB CFI NOR flash @ 0xF8000000, partitioned into 96MiB &lt;strong&gt;nvdfs&lt;/strong&gt; and 32MiB &lt;strong&gt;bootimg&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is evidence of more unknown peripherals:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0xA0000F90&lt;/li&gt;
&lt;li&gt;0xA0001000&lt;/li&gt;
&lt;li&gt;0xA0010000&lt;/li&gt;
&lt;li&gt;0xA0800000 maybe DDR SDRAM PHY&lt;/li&gt;
&lt;li&gt;0xD0000000&lt;/li&gt;
&lt;li&gt;0xEF640000&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;General image&lt;/h1&gt;
&lt;p&gt;Tape firmware container with "IBMTpDrv" magic.&lt;/p&gt;
&lt;p&gt;Header format in 4 byte fields unless noted otherwise:&lt;/p&gt;
&lt;p&gt;jump_instruction / image_size / checksum? / fw_version (4 char) / 0 / 0 / product_id (EBCDIC, 8 bytes) / IBMTpDrv magic ( 8 bytes) 
/ ?? / ?? / ?? / ?? / directory_offset / directory_size / payload_start / ?? / ?? / ??&lt;/p&gt;
&lt;p&gt;Section directory with variable number of slots (default 16 slots), each 32-byte, usually at offset 0x80.&lt;/p&gt;
&lt;p&gt;Entry format in 4-byte fields:&lt;/p&gt;
&lt;p&gt;name / attributes / file_offset / stored_size / memory_address / memory_size / ?? (0) / ?? (0)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;file_offset is counted from start of the file&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Typical sections are fcod/text/roda/vmal/vmli/ramf/pcod/data/kmem/bss/stac/ocmd.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fcod starts at offset 0 and contains the complete file header&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Trailers, TLV coded, are stored after each stored section and not included in the directory.
They appear as (usually 20 byte) gaps in the offsets+size covered by the directory.&lt;/p&gt;
&lt;p&gt;Example: [80 00 00 04 VV VV VV VV][40 00 00 04 VV VV VV VV][00 00 00 00].&lt;/p&gt;
&lt;p&gt;Schema is [TT 00 LL LL   VV * length], LL LL is masked with 1F FF.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;not chained, both checksums only check the section they are placed after&lt;/li&gt;
&lt;li&gt;tag 0x80 = BE u32 sum mod 2^32&lt;/li&gt;
&lt;li&gt;tag 0x40 = GF(2^8) table transform T[i]=[i·38 i·CF i·38 i] mod 0x11D, init 0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is a global trailer at the end of the file backwards TLV scheme starting from end of file, mirror of the section trailer scheme, with chained coverage.&lt;/p&gt;
&lt;p&gt;New tags in global trailer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0x20/0x10 : 256-byte objects, probably crypto signatures like RSA2048&lt;/li&gt;
&lt;li&gt;F0/F1 32-byte slots, at end, tombstone, all zeroes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Validator functions in code:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ImageTableValidate (per-section, exact size match)&lt;/li&gt;
&lt;li&gt;ImageFileValidate (global backward walk, declared±0x80, required mask 0x50000000 = {0x40, 0x10}, sentinel 0x60000).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Two validator copies: fcod (10a026xx) file-level, pcod (112048xx) section-level clone.
GF(2^8) table @ 11A10000 = in BSS, used by pcod, runtime-initialized.&lt;/p&gt;
&lt;h2&gt;fcod @ 0x00 → 0x10A00000 ~18kb&lt;/h2&gt;
&lt;p&gt;Startup code, includes global file header&lt;/p&gt;
&lt;p&gt;Functions right at the start of section set up CPU/TLB/memory map, after that there are functions concerned with
firmware update, e.g. checking the firmware image, erasing flash, writing flash,
NOR flash unlock and communication, serial logging, flash verify.&lt;/p&gt;
&lt;p&gt;The fcod section looks very minimal and self-contained and contains a DTB right at the end:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PowerPC 405S, ibm,jag5 / ibm,ltox&lt;/li&gt;
&lt;li&gt;132MB RAM @ 0x10000000&lt;/li&gt;
&lt;li&gt;flash 0xF8000000 128MB&lt;/li&gt;
&lt;li&gt;nvdfs 96MB + bootimg 32MB partitions&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;text @ 0x4834 → 0x11220000 ~4.5kb&lt;/h2&gt;
&lt;p&gt;FCOD functions for booting the Linux kernel, like checking ELF images, initrd, devicetree and doing CPU and memory setup.&lt;/p&gt;
&lt;h2&gt;roda @ 0x5A78 → 0x11300000 ~2kb&lt;/h2&gt;
&lt;p&gt;Lots of strings for fcod that make it easy to identify firmware update code and kernel bootloader.&lt;/p&gt;
&lt;h2&gt;vmal @ 0x61D0 → 0x11300744 ~7.5kb&lt;/h2&gt;
&lt;p&gt;Loaded directly after roda.
All zeroes.&lt;/p&gt;
&lt;h2&gt;vmli @ 0x8000 → 10B00000 ~1.6MB&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;last 4 bytes are a BE32 size in bytes&lt;/li&gt;
&lt;li&gt;Entry stub b + 0x250 / 0x280&lt;/li&gt;
&lt;li&gt;magic LTOxMCP @ +4&lt;/li&gt;
&lt;li&gt;GOT @ pcod +0xA5B0 (in main image terms pcod file off 0x644BE4 + 0xA5B0 = 0x64F194..0x64F1E4), self-referential r30=PC+0x125B0.&lt;/li&gt;
&lt;li&gt;Bootloader with minimal DTB and gzipped Linux kernel&lt;/li&gt;
&lt;li&gt;no standard uImage, zImage, etc.&lt;/li&gt;
&lt;li&gt;Supposedly standard linker layout for embedded PPC Linux without bootloader?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ramf @ 0x1A3558 → 10D00000 ~4.6MB initrd.&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;last 4 bytes are BE32 size in bytes&lt;/li&gt;
&lt;li&gt;XZ-compressed CPIO archive (initrd)&lt;/li&gt;
&lt;li&gt;reported as defective by xzcat due to length bytes at the end&lt;/li&gt;
&lt;li&gt;minimalist environment, /bin is busybox, sysv-like init with shell scripts, network config with shell scripts&lt;/li&gt;
&lt;li&gt;based on RHEL7? glibc 2.17&lt;/li&gt;
&lt;li&gt;/drv contains tape drive operating software&lt;/li&gt;
&lt;li&gt;/nvd is the "nvdfs" partition from earlier, formatted with ubifs, contains non-volatile files&lt;/li&gt;
&lt;li&gt;dropbear is part of debug build, missing form production&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Tape drive software&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;/drv/dcode.exe is a BE32 PPC ELF executable, operates most of the drive&lt;/li&gt;
&lt;li&gt;/drv/scode.bin is loaded by dcode.exe&lt;/li&gt;
&lt;li&gt;scode.bin contains lots of drive debug and manufacturing diagnostics code with lots of strrings that indicate function&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;pcod @ 0x00644BE4 → 0x11200000 exactly 128kb&lt;/h2&gt;
&lt;p&gt;Nested IBMTpDrv container (dir @ 0x50, 16 32-byte slots, magic is the same)&lt;/p&gt;
&lt;p&gt;Sections :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;text @ 0x2DE4 → 11A00000,&lt;/li&gt;
&lt;li&gt;roda @ 0x6048 → 11A10000, &lt;/li&gt;
&lt;li&gt;data @ 0x6FB8 → 11A20000, &lt;/li&gt;
&lt;li&gt;bss → 11A30000 +0x201000,&lt;/li&gt;
&lt;li&gt;rese @ 0x0001FFFC→ 0xFFFFFFFC&lt;/li&gt;
&lt;li&gt;ocmt → 0x07FD0000&lt;/li&gt;
&lt;li&gt;ocmb → 0x06000000&lt;/li&gt;
&lt;li&gt;comm → 0x00000000&lt;/li&gt;
&lt;li&gt;ocmd → 0x06000000 (flash controller offset?).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Functionality:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adler-32 (zlib NMAX 5552, unroll 16) found in pcod, likely inflate consumer.&lt;/li&gt;
&lt;li&gt;Flash writing and serial output&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;data @ 0x00664BF8  → 0x11400000 4 bytes&lt;/h2&gt;
&lt;p&gt;4 bytes of zeroes, last section warked as stored with file contents&lt;/p&gt;
&lt;h2&gt;memory only sections&lt;/h2&gt;
&lt;p&gt;(Linux) kernel memory, BSS section, Stack section, and ocmd may be the flash controller registers.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;kmem → 0x10000000 size 0x00A00000&lt;/li&gt;
&lt;li&gt;bss  → 0x11500000 size 0x0061001C&lt;/li&gt;
&lt;li&gt;stac → 0x11C00000 size 0x00010000&lt;/li&gt;
&lt;li&gt;ocmd → 0x06000000 size 0x00000104&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;TODO&lt;/h2&gt;
&lt;p&gt;IBM 3592 Hardware Reference / Maintenance Information
3592 SCSI Reference documents a lot of vendor-unique behavior, log pages, and diagnostic commands.&lt;/p&gt;
&lt;p&gt;IBM Redbooks on TS1150 / TS4500&lt;/p&gt;
&lt;p&gt;ITDT (IBM Tape Diagnostic Tool) check out drive dumps&lt;/p&gt;
&lt;p&gt;IBM patents on tape servo, LTM/DSP, and formatter design — IBM patents their tape work heavily and the figures are often block diagrams of the real silicon.&lt;/p&gt;
&lt;p&gt;FCC/teardown photos&lt;/p&gt;</content><category term="Reverse engineering"/><category term="re"/><category term="software"/></entry></feed>