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
GitHub Actionsを使ってNetBSDマイナー機種用のビルドテストCIを書いてみた話 / OSC2025Osaka
tsutsui
0
45
PC-6001のPSG演奏デモを機会にNetBSDを真面目に説明してみる / OSC2024Ehime
tsutsui
0
240
PC-6001のPSG演奏デモをなるべくNetBSD環境を使って作った話 / KOF2024
tsutsui
1
370
OSC展示とLUNAとNetBSD / OSC2024Kyoto
tsutsui
1
510
digital VAX, NetBSD/vaxの歴史と VAXstation 3100/m30 展示 / OSC2024Osaka
tsutsui
0
1.1k
SONY NEWS NetBSD移植作業とNWS-3260展示 / KOF2023
tsutsui
0
1.4k
37年前の Sun 3/60 のために最新のNetBSDと最新のX.orgをメンテする話 / KOF2022
tsutsui
1
500
お歳暮で Sun3 が送られてきたので NetBSD/sun3 を展示デモしました / OSC2020Osaka
tsutsui
5
2.8k
NetBSD/zaurus 8.1 を直したあと ブース展示デモ内容を作った話 / OSC2019Tokyo-Fall
tsutsui
0
730
Other Decks in Programming
See All in Programming
Lottieアニメーションをカスタマイズしてみた
tahia910
0
130
動作確認やテストで漏れがちな観点3選
starfish719
6
1k
苦しいTiDBへの移行を乗り越えて快適な運用を目指す
leveragestech
0
600
メンテが命: PHPフレームワークのコンテナ化とアップグレード戦略
shunta27
0
120
Linux && Docker 研修/Linux && Docker training
forrep
24
4.5k
AIの力でお手軽Chrome拡張機能作り
taiseiue
0
170
ファインディLT_ポケモン対戦の定量的分析
fufufukakaka
0
710
Kubernetes History Inspector(KHI)を触ってみた
bells17
0
230
もう僕は OpenAPI を書きたくない
sgash708
5
1.7k
PHPカンファレンス名古屋2025 タスク分解の試行錯誤〜レビュー負荷を下げるために〜
soichi
1
200
Spring gRPC について / About Spring gRPC
mackey0225
0
220
Amazon ECS とマイクロサービスから考えるシステム構成
hiyanger
2
560
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
10
1.3k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
9
440
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
193
16k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
30
2.2k
It's Worth the Effort
3n
184
28k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
114
50k
Side Projects
sachag
452
42k
A designer walks into a library…
pauljervisheath
205
24k
Raft: Consensus for Rubyists
vanstee
137
6.8k
What's in a price? How to price your products and services
michaelherold
244
12k
Large-scale JavaScript Application Architecture
addyosmani
511
110k
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バイト側が返るので違う値となる
まとめ • コンパイラの警告は大事です • プロトタイプ宣言は重要です • 機種に依存しない記述が大事です • 調べて推測通りに動くと楽しい!