Hercules

Herculesは色々なところで紹介されているS370等のエミュレータ

The Hercules System/370, ESA/390, and z/Architecture Emulator
らしいが、今回は単純にLinuxが動くエミュレータとして用いる。
http://www.conmicro.cx/hercules/

海外のニュースサイトに
Hercules用Debian/S390のディスクイメージが紹介されていたので
それを流用する。

http://people.debian.org/~mdz/hercules/

また、
http://home.sprintmail.com/~dtrout/Hercules/ctci-w32-index.html
よりCTCI-W32というネットワーク対応のためのモジュールをもってくる。

hercules.cnfを書き換える。

0C00 3088 CTCI-W32 192.168.1.150 192.168.1.29 1024 64
0C01 3088 CTCI-W32 192.168.1.150 192.168.1.29 1024 64

0C00 3088 CTCI-W32 仮想ホストIP リアルホストIP 1024 64
0C01 3088 CTCI-W32 仮想ホストIP リアルホストIP 1024 64

IP固定でない場合にはMACでも良い(多分)

herculesを起動中に[ESC]を押して
ステータス表示の右上を見ると

B 0300 3390 DASD debian.3390 [1113 cyls]
C 0C00 3088 CTCA CTCI 192.168.1.150/192.1
D 0C01 3088 CTCA CTCI 192.168.1.150/192.1

と出ていればとりあえずのデバイスの認識はできている。
(FishpackやらPcapが入ってないとここまで表示されないと思われる。)

簡単な操作。
IPL DASDの番号(IPL300)でLinuxの起動
Linuxに文字を渡したいときは行頭にドット「.」を入れる。


Linux上で

ifconfig ctc0 up としても

ctc0: ERROR while getting interface flags: No such device

となる。
これを元にぐぐると、ctcのアドレスをカーネルにパラメータとして与える必要がある。
ia32ではLiloが良く使われてきたが、S390ではziplというブートローダがある。
 

debian:/boot#
.cat /etc/zipl.conf
cat /etc/zipl.conf
defaultboot!
default=debian

debian!
target=/boot
image=/vmlinuz
parmfile=/boot/parmfile
debian:/boot#

 
/boot/parmfileに書き足せばよいことが分かる。
(さらりと書いたがこのあたりですごくはまった。)

.echo chandev=ctc0,0x0C00,0x0C01 >> parmfile
cat parmfile
root=/dev/dasd/0300/part1 ro noinitrd dasd=0300 vmpoff="LOGOFF"
chandev=ctc0,0x0C00,0x0C01

 

zipl
building bootmap : /boot/bootmap
adding Kernel Image : /vmlinuz located at 0x00010000
adding Parmline : /boot/parmfile located at 0x00001000
Bootloader for ECKD type devices with z/OS compatible layout installed.
Syncing disks....
...done
debian:/boot#

 
再起動後herculesに[ESC]を押して
ステータス表示の右上を見ると
C 0C00 3088 CTCA CTCI 192.168.1.150/192.1
0C00が黄色になっている。

ifconfig ctc0 192.168.1.150 pointopoint 192.168.1.29

 
ctc0はポイントツーポイント接続だ。
 

.ping 192.168.1.29 -c 13
ping 192.168.1.29 -c 13
PING 192.168.1.29 (192.168.1.29): 56 data bytes
64 bytes from 192.168.1.29: icmp_seq=0 ttl=128 time=7.0 ms
64 bytes from 192.168.1.29: icmp_seq=1 ttl=128 time=5.0 ms
64 bytes from 192.168.1.29: icmp_seq=2 ttl=128 time=4.9 ms
64 bytes from 192.168.1.29: icmp_seq=3 ttl=128 time=2.9 ms
64 bytes from 192.168.1.29: icmp_seq=4 ttl=128 time=2.9 ms
64 bytes from 192.168.1.29: icmp_seq=5 ttl=128 time=2.9 ms
64 bytes from 192.168.1.29: icmp_seq=6 ttl=128 time=2.9 ms
64 bytes from 192.168.1.29: icmp_seq=7 ttl=128 time=2.9 ms
64 bytes from 192.168.1.29: icmp_seq=8 ttl=128 time=2.9 ms
64 bytes from 192.168.1.29: icmp_seq=9 ttl=128 time=2.9 ms
64 bytes from 192.168.1.29: icmp_seq=10 ttl=128 time=5.9 ms
64 bytes from 192.168.1.29: icmp_seq=11 ttl=128 time=3.9 ms
64 bytes from 192.168.1.29: icmp_seq=12 ttl=128 time=3.0 ms

 
Breakが送れない(Herculesが受け取ってしまう)為pingの-cを忘れずに。
 
他のホストとは隔絶されているためこれ以上の検証はここでは行わない。
通したければWindows側でパケットフォワードしてあげればよい。
(いつからこの実装になったのだろう。以前試したときにはBochsと同じ実装に見えた。)