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/luna68kの歴史解説と、LUNAでアニメGIF再生デモと ついでにPC-6001デモも作った話 / OSC2025Kyoto
tsutsui
0
56
NetBSDの解説と NetBSD/luna68kの歴史と ついでにPC-6001展示 / OSC2025Tokyo-spring
tsutsui
0
140
GitHub Actionsを使ってNetBSDマイナー機種用のビルドテストCIを書いてみた話 / OSC2025Osaka
tsutsui
0
110
PC-6001のPSG演奏デモを機会にNetBSDを真面目に説明してみる / OSC2024Ehime
tsutsui
0
380
PC-6001のPSG演奏デモをなるべくNetBSD環境を使って作った話 / KOF2024
tsutsui
1
500
OSC展示とLUNAとNetBSD / OSC2024Kyoto
tsutsui
1
630
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
600
Other Decks in Programming
See All in Programming
Swift Updates - Learn Languages 2025
koher
2
470
Introducing ReActionView: A new ActionView-compatible ERB Engine @ Rails World 2025, Amsterdam
marcoroth
0
670
Amazon RDS 向けに提供されている MCP Server と仕組みを調べてみた/jawsug-okayama-2025-aurora-mcp
takahashiikki
1
110
@Environment(\.keyPath)那么好我不允许你们不知道! / atEnvironment keyPath is so good and you should know it!
lovee
0
110
MCPでVibe Working。そして、結局はContext Eng(略)/ Working with Vibe on MCP And Context Eng
rkaga
5
2.2k
go test -json そして testing.T.Attr / Kyoto.go #63
utgwkk
3
290
個人軟體時代
ethanhuang13
0
320
AWS発のAIエディタKiroを使ってみた
iriikeita
1
180
ファインディ株式会社におけるMCP活用とサービス開発
starfish719
0
310
そのAPI、誰のため? Androidライブラリ設計における利用者目線の実践テクニック
mkeeda
2
270
アプリの "かわいい" を支えるアニメーションツールRiveについて
uetyo
0
230
知っているようで知らない"rails new"の世界 / The World of "rails new" You Think You Know but Don't
luccafort
PRO
1
110
Featured
See All Featured
The Cult of Friendly URLs
andyhume
79
6.6k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
61k
Become a Pro
speakerdeck
PRO
29
5.5k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
How STYLIGHT went responsive
nonsquared
100
5.8k
Java REST API Framework Comparison - PWX 2021
mraible
33
8.8k
The Invisible Side of Design
smashingmag
301
51k
Bash Introduction
62gerente
615
210k
GraphQLとの向き合い方2022年版
quramy
49
14k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3k
The Straight Up "How To Draw Better" Workshop
denniskardys
236
140k
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バイト側が返るので違う値となる
まとめ • コンパイラの警告は大事です • プロトタイプ宣言は重要です • 機種に依存しない記述が大事です • 調べて推測通りに動くと楽しい!