Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
KOF2015 emacs 18.59 and mule 1.1 on NetBSD 7.0
Search
Izumi Tsutsui
November 07, 2015
Programming
2
1.2k
KOF2015 emacs 18.59 and mule 1.1 on NetBSD 7.0
KOF2015 関西オープンソースの「BSDなひととき」のセミナーで発表した
「emacs 18.59 / mule 1.1 を NetBSD 7.0 で動かした話」
のスライドです。
Izumi Tsutsui
November 07, 2015
Tweet
Share
More Decks by Izumi Tsutsui
See All by Izumi Tsutsui
NetBSDの解説と NetBSD/luna68kの歴史と ついでにPC-6001展示 / OSC2025Tokyo-spring
tsutsui
0
120
GitHub Actionsを使ってNetBSDマイナー機種用のビルドテストCIを書いてみた話 / OSC2025Osaka
tsutsui
0
96
PC-6001のPSG演奏デモを機会にNetBSDを真面目に説明してみる / OSC2024Ehime
tsutsui
0
350
PC-6001のPSG演奏デモをなるべくNetBSD環境を使って作った話 / KOF2024
tsutsui
1
470
OSC展示とLUNAとNetBSD / OSC2024Kyoto
tsutsui
1
600
digital VAX, NetBSD/vaxの歴史と VAXstation 3100/m30 展示 / OSC2024Osaka
tsutsui
0
1.3k
SONY NEWS NetBSD移植作業とNWS-3260展示 / KOF2023
tsutsui
0
1.6k
37年前の Sun 3/60 のために最新のNetBSDと最新のX.orgをメンテする話 / KOF2022
tsutsui
1
570
お歳暮で Sun3 が送られてきたので NetBSD/sun3 を展示デモしました / OSC2020Osaka
tsutsui
5
2.9k
Other Decks in Programming
See All in Programming
「テストは愚直&&網羅的に書くほどよい」という誤解 / Test Smarter, Not Harder
munetoshi
0
190
PicoRuby on Rails
makicamel
2
140
おやつのお供はお決まりですか?@WWDC25 Recap -Japan-\(region).swift
shingangan
0
140
Claude Code + Container Use と Cursor で作る ローカル並列開発環境のススメ / ccc local dev
kaelaela
12
6.9k
RailsGirls IZUMO スポンサーLT
16bitidol
0
200
テスト駆動Kaggle
isax1015
1
520
レベル1の開発生産性向上に取り組む − 日々の作業の効率化・自動化を通じた改善活動
kesoji
0
270
システム成長を止めない!本番無停止テーブル移行の全貌
sakawe_ee
1
310
Porting a visionOS App to Android XR
akkeylab
0
660
Result型で“失敗”を型にするPHPコードの書き方
kajitack
5
1k
PostgreSQLのRow Level SecurityをPHPのORMで扱う Eloquent vs Doctrine #phpcon #track2
77web
2
580
スタートアップの急成長を支えるプラットフォームエンジニアリングと組織戦略
sutochin26
1
6.9k
Featured
See All Featured
Designing Experiences People Love
moore
142
24k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
Balancing Empowerment & Direction
lara
1
440
Product Roadmaps are Hard
iamctodd
PRO
54
11k
Practical Orchestrator
shlominoach
189
11k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.4k
Optimising Largest Contentful Paint
csswizardry
37
3.3k
Music & Morning Musume
bryan
46
6.7k
It's Worth the Effort
3n
185
28k
Docker and Python
trallard
45
3.5k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
Transcript
emacs 18.59 / mule 1.1 を NetBSD 7.0 で動かした話 関西オープンソース2015
謎アプリ on 謎マシン Izumi Tsutsui
[email protected]
Emacs 使ってますか?
最新版は 24.5
・1992年10月リリース (LUNA-II発売の翌年) ・emacs18 の最終版 emacs 18.59 とは
今でもダウンロードできます https://ftp.gnu.org/old-gnu/emacs/
Emacs 18 antinews http://www.dennougedougakkai-ndd.org/alte/1ste/emacs/elisp-manual-19-2.4-jp2.0/elisp-jp_45.html
MULti-lingual Enhancment to GNU-Emacs mule 1.x は emacs18 を ベースに多言語化したもの
mule とは
なぜ mule 1.1なのか • 某サークルの386BSD機に入ってた • 機能的にあんまり困ってなかった • Emacs19で動かない *.el
があった • 1996年頃のNetBSD 1.2でも ビルドできてしまった • NetBSDの後方互換性が高過ぎて 気がつくと20年近く経っていた
1998年製バイナリ https://twitter.com/tsutsuii/status/566608838267138051
Yet another emacs18 user https://twitter.com/Chris_J_Baird/status/566596051042185216
復活の機運(?) https://twitter.com/tsutsuii/status/566617110042775552
とりあえず 適当にいじって gentooパッチを マージしてみる
なんとなく動きました https://twitter.com/tsutsuii/status/570284256338927617
X11term版が動かない問題 • 通常のターミナル版は動く • X11term版は起動後固まる? ⇒read(2)から帰ってこない • とりあえずいろいろ読んでみる
/* 92.7.10 modified for Mule Ver.0.9.5 by T.Enami In compile_pattern(),
set bufp->buffer to 0 for forcing re_compile_pattern() to alloc (not realloc) it. In set_pattern(), last_regexp is set to Qnil. */ https://twitter.com/tsutsuii/status/571003158199021569
えなみさん とは • 某サークルの先輩に当たる方 • 某曽田さんと同年代 • NetBSDデベロッパ • mule初期からいろいろと
パッチ送っていたり
https://twitter.com/tsutsuii/status/571403457875161088
4時間後
https://twitter.com/_enami/status/571469622001577984
中略
https://twitter.com/_enami/status/571487238321647616
( ゚д゚) https://twitter.com/tsutsuii/status/571487878192054272
NetBSD/i386 では復活 https://twitter.com/tsutsuii/status/571518589108293632
一部修正してluna68kでもOK https://twitter.com/tsutsuii/status/575336006292934657
amd64ではダメっぽい https://twitter.com/tsutsuii/status/576445070624186368
ふたたびえなみさん https://twitter.com/_enami/status/576454331299291136
Lisp_Object とは • 整数、ポインタ、その他の 内部値を保持する整数型 • emacs 18 では int型で定義
• mule 1.1は alpha OSF/1対応で long型でも定義できるように なっている?
int vs long 問題 Lisp_Objectを longにした場合 以下の問題が発生する • 関数プロトタイプ宣言が不完全 ⇒返り値が暗黙的に
int になる ⇒LP64では Lisp_Object の 上位32ビットが失われる
https://twitter.com/_enami/status/576515850233995265
( ゚д゚) https://twitter.com/tsutsuii/status/576550741055156225
個別に見てても 終わらないので 片っ端から プロトタイプ宣言 を追加
作業結果 https://twitter.com/tsutsuii/status/577167362266263552
修正行数 https://github.com/tsutsui/mule1.1-netbsd/commit/cb7f46b0ced6a3860f292c893ded76d3010b346e
ついでに オリジナルの emacs 18.59 も amd64対応 https://twitter.com/tsutsuii/status/578972091342401536
LP64対応の次は
https://twitter.com/tsutsuii/status/658325284463054848
というわけで sparc64 (LP64BE) です
初回トライ結果 https://twitter.com/tsutsuii/status/578230868579225600
mule固有部分で 落ちているので、 オリジナルの emacs 18.59でも トライしてみる
超微妙動作 なにコレ(´・ω・`)
よくわからんので 関数宣言を K&R⇒ANSI にして警告出るか 試してみる
修正行数 https://github.com/tsutsui/emacs-18.59-netbsd/commit/402435325b01dd9d95bc975ea1905a046dd5cfe2
作業結果 https://twitter.com/tsutsuii/status/658229468532596736
もう少し真面目に調べてみる • "*invalid*” の条件を確認 ⇒Lisp_Object の型情報が変 • i386で同じ変数の変化を確認 ⇒値が変化する関数を特定 •
その関数を見てみると……
ポインタキャストの罠? for (offset = (char *)&buffer_local_flags.name - (char *)&buffer_local_flags; offset
< sizeof (struct buffer); offset += sizeof (Lisp_Object)) /* sizeof int == sizeof Lisp_Object */ if (*(int *)(offset + (char *) &buffer_local_flags) > 0 || *(int *)(offset + (char *) &buffer_local_flags) == -2) *(Lisp_Object *)(offset + (char *)b) = *(Lisp_Object *)(offset + (char *)&buffer_defaults); Lisp_Objectっぽい領域に intでアクセスしている。 明らかにクサい https://github.com/tsutsui/emacs-18.59-netbsd/blob/0a7383dcb7b9dbc863fa4adf6c7ae3330ec551d5/src/buffer.c#L270
とりあえず (Lisp_Object *) のキャストに修正
超微妙動作2 ちょっと進んだ?
他のソースにも 同様のキャストが あったので 同じく修正
https://twitter.com/tsutsuii/status/658311797850542081
amd64では動いて sparc64では動かない ケース (LP64BE問題)
LP64LEでの動作 (LSB) 02 00 00 00 00 00 00 00
(MSB) 64ビットのLisp_Objectを 32ビットの (int *) でアクセスした場合、 先頭から4バイトの値を読み 32ビット整数として返す ⇒4バイトに収まる整数なら同じ値になる Lisp_Object (1) = 2 Lisp_Object (2) = 0 (LSB) 00 00 00 00 00 00 00 00 (MSB)
LP64BEでの動作 (MSB) 00 00 00 00 00 00 00 02
(LSB) Lisp_Object (1) = 2 0 Lisp_Object (2) = 0 (MSB) 00 00 00 00 00 00 00 00 (LSB) 64ビットのLisp_Objectを 32ビットの (int *) でアクセスした場合、 先頭から4バイトの値を読み 32ビット整数として返す ⇒上位4バイト側が返るので違う値となる
まとめ • コンパイラの警告は大事です • プロトタイプ宣言は重要です • 機種に依存しない記述が大事です • 調べて推測通りに動くと楽しい!