Solus Linuxでカーネルのアップデートが適用されない

Solus Linuxを使っていてある時からカーネルのアップデートが適用されなくなり、VirtualBoxなどが動作しなくなり困ったことになりました。
一回修正しようと適当に/boot以下をいじったら無事起動しなくなりLiveUSBのお世話になったので、今回はよく調べてから対応することに。

Solus LinuxではブートシステムとしてClearLinuxのclr-boot-managerというのを使っており、UEFI環境下ではバックエンドとしてsystemd-bootを利用しているらしいです。
というわけでまずはsystemd-bootの状態を確認するために
bootctl statusを実行すると

$ bootctl status
System:
     Firmware: UEFI 2.50 (American Megatrends 5.12)
  Secure Boot: disabled
   Setup Mode: user
 Boot into FW: supported

Current Boot Loader:
      Product: systemd-boot 246
     Features: ✓ Boot counting
               ✓ Menu timeout control
               ✓ One-shot menu timeout control
               ✓ Default entry control
               ✓ One-shot entry control
               ✓ Support for XBOOTLDR partition
               ✓ Support for passing random seed to OS
               ✓ Boot loader sets ESP partition information
          ESP: /dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b
         File: └─/EFI/SYSTEMD/SYSTEMD-BOOTX64.EFI

Random Seed:
 Passed to OS: yes
 System Token: set
       Exists: yes

Available Boot Loaders on ESP:
          ESP: /boot/efi (/dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b)
         File: └─/EFI/systemd/systemd-bootx64.efi (systemd-boot 246)
         File: └─/EFI/BOOT/BOOTX64.EFI (systemd-boot 246)

Boot Loaders Listed in EFI Variables:
        Title: Linux Boot Manager
           ID: 0x0002
       Status: active, boot-order
    Partition: /dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b
         File: └─/EFI/systemd/systemd-bootx64.efi

        Title: Linux Boot Manager
           ID: 0x0000
       Status: active, boot-order
    Partition: /dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b
         File: └─/EFI/SYSTEMD/SYSTEMD-BOOTX64.EFI

        Title: UEFI OS
           ID: 0x0001
       Status: inactive, boot-order
    Partition: /dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b
         File: └─/EFI/BOOT/BOOTX64.EFI

Boot Loader Entries:
        $BOOT: /boot/efi (/dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b)

Default Boot Loader Entry:
        title: Solus 4.1 Fortitude
           id: Solus-current-5.10.9-169.conf
       source: /boot/efi/loader/entries/Solus-current-5.10.9-169.conf
        linux: /EFI/com.solus-project/kernel-com.solus-project.current.5.10.9-169
       initrd: /EFI/com.solus-project/initrd-com.solus-project.current.5.10.9-169
      options: root=PARTUUID=782cda64-d615-4b92-b362-7580b073ca62 quiet loglevel=3 ...

これを見るとESP(UEFIの起動パーティション)は/boot/efiになっており、「Default Boot Loader Entry」はLinux 5.10.9-169が選択されています。
続いて、clr-boot-managerの様子を見てみます。

$ sudo clr-boot-manager list-kernels
* com.solus-project.current.5.10.12-171
  com.solus-project.current.5.10.9-169

Linux 5.10.12-171が既定のカーネルとして設定されています。
どうやら、clr-boot-managerとsystem-bootの連携がうまくいってないみたいです。
次に/boot以下を見ると、efiディレクトリとloaderディレクトリがあり、efiディレクトリの中にはこれまたloaderディレクトリがあり、中の構成もそっくりです。もしやと思い/boot/loaderを削除してclr-boot-manager updateを叩いてみると

$ sudo rm -rf /boot/loader/
$ sudo clr-boot-manager update
[FATAL] cbm (../src/bootloaders/systemd-class.c:L290): Failed to create loader entry for: ///usr/lib/kernel/com.solus-project.current.5.10.9-169 [No such file or directory]
[ERROR] cbm (../src/bootman/update.c:L218): Failed to repair running kernel
[FATAL] cbm (../src/bootloaders/systemd-class.c:L290): Failed to create loader entry for: ///usr/lib/kernel/com.solus-project.current.5.10.12-171 [No such file or directory]
[FATAL] cbm (../src/bootman/update.c:L250): Failed to install default-current kernel: ///usr/lib/kernel/com.solus-project.current.5.10.12-17

どうやらclr-boot-managerはESPの場所を確認せず/bootに書き込んでいるようで、結果実際に使用されている/boot/efi/loader/loader.confが更新されず、昔のカーネルが起動されるみたいです。

特に/boot/efiにこだわってはいないのでESPの位置を/bootに変更することにしました。
一旦/boot/efiをumountし、/etc/fstabを編集して/boot/efiを/bootに変更します。

$ sudo umount /boot/efi
$ sudo rm -rf /boot/loader/ # すでに実行した場合は不要
$ sudo vi /etc/fstab # /boot/efiを/boot/に変更
$ sudo mount /boot

これでbootctl installとclr-boot-manager updateを叩くと

$ sudo bootctl install
Copied "/usr/lib/systemd/boot/efi/systemd-bootx64.efi" to "/boot/EFI/systemd/systemd-bootx64.efi".
Copied "/usr/lib/systemd/boot/efi/systemd-bootx64.efi" to "/boot/EFI/BOOT/BOOTX64.EFI".
Random seed file /boot/loader/random-seed successfully written (512 bytes).
Created EFI boot entry "Linux Boot Manager".
$ sudo clr-boot-manager update
[FATAL] cbm (../src/bootman/kernel.c:L646): Failed to install kernel /boot/EFI/com.solus-project/kernel-com.solus-project.current.5.10.9-169: No such file or directory
[ERROR] cbm (../src/bootman/update.c:L218): Failed to repair running kernel
[FATAL] cbm (../src/bootman/kernel.c:L646): Failed to install kernel /boot/EFI/com.solus-project/kernel-com.solus-project.current.5.10.12-171: No such file or directory
[FATAL] cbm (../src/bootman/update.c:L250): Failed to install default-current kernel: ///usr/lib/kernel/com.solus-project.current.5.10.12-171
[ERROR] cbm (../src/bootman/bootman.c:L942): Error opening /boot//EFI/com.solus-project: No such file or directory
[ERROR] cbm (../src/bootman/update.c:L371): Failed to remove old freestanding initrd

とエラーが出てるので、とりあえず

$ sudo mkdir /boot/EFI/com.solus-project
$ sudo clr-boot-manager update

でうまくいったので良しとします…
再度bootctl statusを見ると

$ bootctl status
System:
     Firmware: UEFI 2.50 (American Megatrends 5.12)
  Secure Boot: disabled
   Setup Mode: user
 Boot into FW: supported

Current Boot Loader:
      Product: systemd-boot 246
     Features: ✓ Boot counting
               ✓ Menu timeout control
               ✓ One-shot menu timeout control
               ✓ Default entry control
               ✓ One-shot entry control
               ✓ Support for XBOOTLDR partition
               ✓ Support for passing random seed to OS
               ✓ Boot loader sets ESP partition information
          ESP: /dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b
         File: └─/EFI/SYSTEMD/SYSTEMD-BOOTX64.EFI

Random Seed:
 Passed to OS: yes
 System Token: set
       Exists: yes

Available Boot Loaders on ESP:
          ESP: /boot (/dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b)
         File: └─/EFI/systemd/systemd-bootx64.efi (systemd-boot 246)
         File: └─/EFI/BOOT/BOOTX64.EFI (systemd-boot 246)

Boot Loaders Listed in EFI Variables:
        Title: Linux Boot Manager
           ID: 0x0002
       Status: active, boot-order
    Partition: /dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b
         File: └─/EFI/systemd/systemd-bootx64.efi

        Title: Linux Boot Manager
           ID: 0x0000
       Status: active, boot-order
    Partition: /dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b
         File: └─/EFI/SYSTEMD/SYSTEMD-BOOTX64.EFI

        Title: UEFI OS
           ID: 0x0001
       Status: inactive, boot-order
    Partition: /dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b
         File: └─/EFI/BOOT/BOOTX64.EFI

Boot Loader Entries:
        $BOOT: /boot (/dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b)

Default Boot Loader Entry:
        title: Solus 4.1 Fortitude (Solus-current-5.10.12-171.conf)
           id: Solus-current-5.10.12-171.conf
       source: /boot/loader/entries/Solus-current-5.10.12-171.conf
        linux: /EFI/com.solus-project/kernel-com.solus-project.current.5.10.12-171
       initrd: /EFI/com.solus-project/initrd-com.solus-project.current.5.10.12-171
      options: root=PARTUUID=782cda64-d615-4b92-b362-7580b073ca62 quiet loglevel=3 ...

無事更新されていているみたいなので完了です。

あけましておめでとうございます。

(今年は雲が多くてうまく見れなかった)初日の出を見て、家で過ごしてるところです。
去年は実家に閉じこもっており、夏場に鉄道旅行をした以外は何もしてないですね…
プログラムの進捗にも波があってOSでのマルチコアのサポートなどをしてました。
今年もよろしくお願いします。

セキュリティ・ネクストキャンプ2020参加記(チューター)

ドッタンバッタン大騒ぎして結局今までろくにまとめられなかったセキュリティキャンプの参加記。
感想も交えて詳しく書けたらいいなと思っています。

セキュリティキャンプ2017参加記

こんなことを書いて早3年、今度はセキュリティ・ネクストキャンプ2020にチューターとして参加させていただくことができました。というわけで前回と同じようにまとめたいと思います。
セキュリティキャンプの様子を知りたい方は以下のリンクをご覧ください。
セキュリティキャンプ2017参加記
セキュリティキャンプ2019参加記(チューター)
セキュリティキャンプ – カテゴリーアーカイブ

今年のセキュリティ・キャンプとセキュリティ・ネクストキャンプは史上初のオンライン開催となりました。
そのため、時系列でまとめるのは難しいですが、全体的な感想をまとめておきます。

全体的な進行形式

開会式と閉会式はYoutube Liveで行われ、講義自体はGoogle Meetで行われました。ブラウザから参加できるので、特別な設定無しで良かったです。(特にZoomは不調続きで大学で使用していてイライラしており使ってほしくなかったので、Meetを使ってもらえて良かったです。)
MeetのアドレスはKintoneで管理されており、講義ごとのスレッドが立っていてその講義に関する質問もできるようになっています。

良かった点

  • オンライン開催ながら講義の質はとても高く、チュータの自分でも多くのことを学べた(それでいいのかチューターよ)
  • Kintoneでの事前準備の情報確認はよく行われており、理解しやすかったと思う
  • オンライン開催だから、どこでも参加できた(普段は実家のある福岡で参加して、一回だけ旅行先の金沢の東横インから参加しました)
  • 録画が公開されており、わからないところは振り返ってみることができたのは助かりました。ただ、自分が担当していた講義以外は権限の調整が上手く行っていないところもあるらしくそこら辺は要改善かなと思います

反省点

  • 今回のチュータ業務は自分の専門外の分野も含んでいたため、事前準備をしてもサポートしにくい分野もあって力不足を感じた…
  • カメラをオンにするとCPU使用率が上がってファンがうるさくなるためつけられなかったが、できればオンにして参加したかった
  • オンラインコミュニケーションはやはり難しく、受講者同士の会話が少ないように思えました(モブプログラミングの回ではかなり活発になっていましたが)
  • オンラインで話すと割り込まれることが少ないのでついつい喋りすぎたと反省…

まとめ

オンラインで行っても質の高い講義があったのはさすがセキュリティキャンプだなと思いました。
ただ、例年の美味しいご飯と朝から晩までとことん打ち込める環境はセキュリティ・キャンプの醍醐味かなと思います。いつかまた現地で開催できるといいなと願っています。

自作OSとマルチコア

この記事は自作OS Advent Calendar 2020の9日目の記事です。

最近は大学の課題や様々な用事、精神的事情が重なってなかなかプログラムがかけてませんがアドベントカレンダーの枠が空いていたので短いですが急遽この記事を書いてみました。

最近、私の自作OS – Methylenixでマルチコア(SMP)対応を行いました。
https://github.com/PG-MANA/Methylenix

このOSはx86_64用に開発されているわけですが、x86_64では通常起動直後はBSP(BootStrap Processor)のみが動作しておりそれ以外のコアは停止しています。そのためにBSPがAP(Application Processor)を適切に初期化してあげる必要があり、これにはUEFIのMpServiceというものを使用するか(よく知らないので詳細はここでは説明できない)、LocalAPICのプロセッサ間通信を利用します。
Methylenixでは後者を選択しており、
https://github.com/PG-MANA/Methylenix/blob/11239235352ac46a051999edd47ae0590ba5f6c7/src/arch/x86_64/init.rs#L269で実装されています。
この方式ではAPが16bitリアルモードで立ち上がってきてしまうので、メモリアドレスが1MB以下の場所のメモリの確保やブートコードの転送などいろいろなことをしています…(ここらへんの設計が地味に辛かった…)

一方RISC-VなどのRISC系のCPUは起動と同時に全てのコアが一斉にエントリポイントを実行することが多く、この場合はコアIDを見ながらセマフォなどの排他処理を最初から行わないとスタックの競合やUARTの出力がダブるなど(HeHello,o, wwoorrldld!!となるなど)するので注意が必要です。RISC-VボードのSDKなどでif(core_id == 0){…}などあるのはこのためです。

x86_64でのマルチコア対応などをまとめてしっかりとした文章にしたいな…

Kyashの不正利用未遂にあった話

昨今なんちゃらPayの不正出金問題で「大変だなぁ〜」言うてたら自分も引っかかってたようで、夕方にメールが届いたので記録しておきます。

事の発端

Kyashの残高を確認しようとアプリを開いたところ、右上の通知マークが赤くなっていたので、確認すると「Kyash Visaカードが登録されました」との通知がありました。
「そんな覚えないんだが…」と詳細を確認したところ、以下のような登録内容でした。
Kyash Visaカード登録画面

はてさて、わしゃコスメには興味ないぞ?と思いながら文面通りカードロックして問い合わせてみたところ、そのメールの返信ではなくBCCで一斉に配信されたと思われる以下のメールがKyashからとどきました。

平素よりKyashをご利用いただき誠にありがとうございます。

突然のご連絡となり誠に恐縮ではございますが、お客さまのカード番号に対して不審な請求が確認されました。
誠に勝手ながら、安全のために弊社にて一時的にKyash Cardを停止し、利用ができない設定とさせていただきました。

今後の不正利用を防止する為、Kyash Cardを再発行させていただきたく、以下の通りご案内いたします。

Kyash Supportからのメールより

調べてみると同様の被害にあった人が多数存在するようで全員同じ店舗で登録されていました。
再度Kyashのアプリを開くと
カード削除後のKyash

Kyashカードが削除され決済できないようになってました。「突然の連絡」とはありますが本当に突然で出先で決済しようとしてた人がいたら大変そうだな…と思いましたが、とりあえず自分はカードの利用予定は土日までないので、詳細の発表を待って再発行しようと思います。(事の次第では他のサービスへの移行も検討するので)

不審な決済はなく実害がゼロで当日中に通知が来たので一安心するとともにKyashの対応の速さに感心しました。
金融機関のセキュリティが色々問題となってますが、不正利用されてないか常に監視しないといけないですね…Kyashをメインに使用してデビットカードやクレジットカードの情報漏洩を防ぐ目的もあったのでKyashアカウントだけの被害であれば今回の事件はその備えがうまく行ったと言えるのですがどうなることでしょう…

続報があれば追記します。

Twitterに上げる動画をffmpegで再圧縮する

一眼レフカメラで撮った動画をTwitterにあげようにも「互換性のない」と却下されるのでffmpegで変換することに。
変換前後でVLCのコーディック情報を比べると色空間情報が消えてるのでAdobeRGBなどを使ってると弾かれる模様?

ffmpeg -i “input/file/path.mp4” -c:v libx264 -c:a aac -vf fps=30 -aspect 16:9 outputfilepath.mp4

場合によってはこれ以上のオプションをつけないといけないかもしれない

セキュキャン△(セキュリティキャンプのススメ)

タイトルでコケてますね。流行に乗りたかったんです、ゴメンナサイ。(2020年になっては流行りでもなくなった…)

さて
セキュリティ・キャンプ全国大会2018
セキュリティ・キャンプ全国大会2019
セキュリティ・キャンプ全国大会2020(オンライン)

セキュリティ・キャンプ全国大会の受講者の募集が始まりましたよ。
今年もまた、あの熱い夏が来るんですね…どんな方が参加するのか…
今年は、講師の方との交流時間が増やされていたり、小中学生でも参加しやすいように就寝時間が早めのジュニアユースができていたりと、去年参加した私たちの感想や意見が反映されててとてもいい感じです。

2020年追記: 今年はオンラインで長期間実施するそうですが、オンラインでも多くのことが得られるのではないかと思います。また「受講生としての参加は一回のみ」という原則がありますが今年ばかりは特例が出て来年も応募できるみたいです。二度行けるなんてお得じゃないですか、今すぐ応募しましょう。

私自身のセキュリティキャンプの応募用紙や体験記はカテゴリー: セキュリティキャンプにある記事を参照してください。
数個リンクを貼っておきます。
セキュリティキャンプ 応募課題晒し
セキュリティキャンプ 応募から結果発表まで
セキュリティキャンプ2017参加記
セキュリティキャンプ2019参加記(チューター)

今回これを書いたのは、セキュリティキャンプに応募しようか迷ってる人に一つでもいいから情報を渡せたらいいなと書いたものです。SEO的に検索結果の下の方に出てたかと思いますが、それにもかかわらず、わざわざ見ていただきありがとうございます。

参加すると何がいいのか

突然ですが、あなたはどこに住んでますか。
都会でしょうか、それとも田舎でしょうか。
そして、あなたの周りに80人くらいのITに熱意ある学生はいますか。

私は参加当時福岡に住んでいたのですが当時周りに自分の興味のあることを詳細に語り合える人はいませんでした。
また、IT関係のイベントにも参加していませんでした。
TwitterではITに詳しい人を見かけるけど、どう話したらいいかわからない、という気持ちでした。
(詳しい経緯は応募課題を見てもらえればわかりますが)そんなある日、ふと脳裏にセキュリティキャンプが浮かびました。
無我夢中で応募用紙を書き上げて応募し、結果ありがたく参加させていただけることになり実際参加してみると多くのIT関係者の方にお会いできました。
自分より年下の参加者や年上の学生の方、中には協賛企業の方、有名な本を書かれているプログラマーの方とお話できる機会もあり、それは今でも心の中に焼き付くほどの経験です。
キャンプの間は様座な人の意見や得意分野の話、将来の目標などを聞きました。
その後帰ってくるとOSCやLT大会と実は周りにも話を聞いたり発信できる場があることを発見しました。
いや、正確には行く勇気が出ました。セキュリティキャンプに行って、「情報は情報を発信するところに集まる」という言葉に背中を押されやる気が出ました。
「セキュリティキャンプに行って自分はまだまだだと挫折を感じた。」という文章を多く見たかと思います。たしかに私も失敗をたくさんしましたし、挫折も感じました。
ただ挫折で終わらせないのがセキュリティキャンプです。きっとあなたの背中を押してくれるような体験も待ってるはずです。

セキュリティキャンプの良さはあなたの視野をグッと広げてくれて、さらなる挑戦への勇気を与えてくれるということです。(他にもたくさんあります)

セキュリティに詳しくないよ…

私はx86OS自作入門コースにいましたが、みなさんが想像するような、アンチウイルスソフトや、不正アクセス検知などは一切していません。
RustでOS(といえるのか?)を書いてましたが、Rustはセキュアな言語を目指してるのでそんな言語でOSを作ればセキュリティに貢献するかもしれないと思ってました。
集中コースでプログラムを書いてみたいなら、セキュリティに深くこだわる必要もないかもしれません。
また、選択コースでは以前耳にした暗号技術や興味のある分野のセキュリティについての講義を受けるのも良いかもしれません。
いずれにせよ準備期間があり、その間にオンライン上で事前学習ができますのでそこでわからないことを詳しく聞けるでしょう。

ガチプロじゃないから落ちそう

「ガチプロじゃないけど受かった」って文章、たっぷり見てきたでしょう。
ガチプロじゃなくても受かるらしいですよ。中にはガチプロなのに偽…なんでもないです。
私はやってきたことをイキってイキりまくってドヤ顔で書きました、もうそれはあとから見てしょうもないことまで書いてるなぁと思うほど。
とりあえず、書いてみましょう。

多くの講師の方がよくおっしゃってることは「課題ではやる気を見ている」ということです。
「調べてみてこういうところがわかったけど、〇〇がよくわからなかった」よりも「調べてみたけど、○○がわからなかった。だからサイトを参考にこんなプログラムを書いてみた、どうしてもわからないここの部分だけはサイトのコードを真似したけど、それ以外は自分なりの理解で書いてみた。書いたプログラムを実行したところ、大方動くけどたまにクラッシュするから解析したところ、△△な処理でおかしくなってるみたいなので修正を試みたが、うまく行かなかった。」のほうが自分なりの解釈と解決方法を提示していて、成功はしていないものの様々な事を試したことがわかります。
参加記を見ていただくとわかりますが、キャンプの中では複雑怪奇な不具合に遭遇することもあり、単純なネットサーフィンだけでは解決できないこともあります。その時に様々な手段で解決しようとすることが重要となってきます。講師の方はその手段を取る熱意があるかを見ているのだと思います。

セキュリティ・キャンプは修了してもそこで終わるわけではありません。
続けてこそだと思います。
今でも修了生とのつながりもありますし、修了生の主催したLTにも行ったことがあります。
あなたがセキュリティキャンプで素敵な経験をできることを願っています。

Zen言語で配列ポインタに詰まった話

オンライン授業で課題が多くてバタバタしているPG_MANAです。

今回、Zen言語(https://zen-lang.org/ja-JP/)に新しいバージョンが登場し言語仕様が一部変わったようで、build.zenの書き換えが必要になりました。

それとは別にZen言語でVRAMに書き込もうとしたときに躓いたので備忘録して残しておきます。

環境

  • Solus Linux(Linux Kernel 5.6.4-152.current) x86_64
  • Zen(v0.8.20200706LTS)

ソースコードと解析

今回書いていたコードはi386な環境でfreestandingで起動して画面を白で塗りつぶすというものです。(hariboteOSのブートローダを使用)(一部コードを削除)

export fn HariMain() linksection(".text.hari_main") noreturn {
    var p: usize = 0;

    if (binfo.vmode == 16) {
        const vram = @intToPtr(*volatile [*]mut u16,0xfd000000).*; // 0xfd000000はVRAMのアドレス
        const max: usize = 1024 * 768;
        while (p < max) {
            vram[p] = 0xffff;
            p += 1;
        }
    }

    while (true) {
        asm volatile ("hlt");
    }
}

これがうまく動かないのでobjdumpを覗いたところ

...
  48:   b8 00 00 00 fd          mov    eax,0xfd000000
  4d:   8b 00                   mov    eax,DWORD PTR [eax]
  4f:   89 45 f8                mov    DWORD PTR [ebp-0x8],eax
  52:   81 7d fc 00 00 0c 00    cmp    DWORD PTR [ebp-0x4],0xc0000
  59:   73 1c                   jae    77 <HariMain+0x47>
  5b:   8b 45 fc                mov    eax,DWORD PTR [ebp-0x4]
  5e:   8b 4d f8                mov    ecx,DWORD PTR [ebp-0x8]
  61:   66 c7 04 41 ff ff       mov    WORD PTR [ecx+eax*2],0xffff
  67:   8b 45 fc                mov    eax,DWORD PTR [ebp-0x4]
  6a:   83 c0 01                add    eax,0x1
...

となっています。
これをみるとVRAMにアクセスする際の手続きが
*(*(0xfd000000) + 2 * p)となっています。これではうまく動きません。

一瞬コンパイラのバグを疑ったのですが、よくよく考えると配列型の実態は配列の最初の要素のポインターに過ぎないので@intToPtr(*volatile [*]mut u16,0xfd000000).*と書くとそうなるのは、まあそれはそうです。@intToPtr()につられてついつい一番前に*をつけてしまいました。良くない良くない。

さて原因がわかったので単なる配列型にキャストすべく、const vram = @intToPtr(volatile [*]mut u16,0xfd000000);としてもコンパイルエラーになるので、どうしたものか悩みながら試行錯誤していたところ、順序を入れ替えて
const vram = @intToPtr([*]volatile mut u16,0xfd000000);としたらできました。

結論

export fn HariMain() linksection(".text.hari_main") noreturn {
    var p: usize = 0;

    if (binfo.vmode == 16) {
        const vram = @intToPtr([*]volatile mut u16,0xfd000000); // 0xfd000000はVRAMのアドレス
        const max: usize = 1024 * 768;
        while (p < max) {
            vram[p] = 0xffff;
            p += 1;
        }
    }

    while (true) {
        asm volatile ("hlt");
    }
}

@intToPtrなどビルドイン関数を利用する時はその意味をよく吟味して使いましょう…

MouseProのLTEモジュール(Telit LN940)をLinuxで使う

HPのノートパソコンでハズレを引いて落ち込んでいたのですが、ラストチャンスということでもう一台購入するチャンスを手に入れました。変な欲を出してLTEモジュールがついたPCを選ぼうとMouseProのノートパソコンを購入しました。LenovoのThinkPadも考えましたが、HPのサポートの件でサポート評判の悪いメーカは却下されました。
さて、動作確認用OS・Windowsでは大体のテストは完了しopenSUSEを入れたわけですが、LTEモジュールはすぐには認識してくれませんでした。まあこれは想定していたことでしたし、lsusbやusb-devicesでは表示されているのでいろいろ調べてみることにしました。

環境

  • MousePro-NB510HL
  • openSUSE Tumbleweed
  • KDE Plasma Desktop

搭載されているデバイスを確認

$ usb-devices
...(略)...
T:  Bus=02 Lev=01 Prnt=01 Port=02 Cnt=01 Dev#=  2 Spd=5000 MxCh= 0
D:  Ver= 3.00 Cls=ef(misc ) Sub=02 Prot=01 MxPS= 9 #Cfgs=  3
P:  Vendor=1bc7 ProdID=1900 Rev=03.10
S:  Manufacturer=Telit
S:  Product=Telit LN940 Mobile Broadband
...(略)...

USBデバイスとして接続されていて、Telit社のLN940というデバイスらしいです。
調べてみるとLinux用のドライバあるようで、マニュアルもあり(https://www.telit.com/wp-content/uploads/2018/03/Telit_LN940_Linux_SW_User-Guide_v1.2.pdf)それを読むと、Linuxカーネルにドライバが存在してそうだなと解析しました。

cdc_mbimとqmi_wwan

どうやらWWAN用のモジュールとしてcdc_mbimとqmi_wwanの二種類があるようで、どういう関係でどういう歴史があるかは今後調べていきたいと思いますが、とりあえずデバイスがどういう風に認識しているか確認します。

$ dmesg | grep ww

とするとcdc_etherとしてLTEモジュールが認識されていることを確認できます。
明らかに認識が間違っているのですが、無理やりudevなどでモジュールを変更しようとしても失敗するのでネットを漁っていると、 https://techship.com/faq/how-to-configure-telit-ln94-series-cellular-modules-to-qmi-mode-used-by-linux-systems-with-qmi-wwan-or-gobinet-driver/ を発見しました。
usb_modeswitchを使うらしいです。とりあえずusb_modeswitchやlibqmiやmodemmanagerをインストールします。(ModemManagerはsystemctlでenableしてstartしておきます)

設定


先にKDEのネットワーク設定からMobile Broadband Connectionを追加しておきます。
Docomo系のMVNO(OCN Mobile ONE)の場合は”Any CDMA device”=>”日本”=>”NTTdocomo”=>”My plan is not listed”=>”lte-d.ocn.ne.jp”=>”完了”で設定を追加して、ユーザ名(mobileid@ocn)とパスワード(mobile)とPIN(初期設定では0000)を設定して保存します。
次に

$ sudo usb_modeswitch -v 1bc7 -p 1900 -u 3

としてみます。再度usb_devicesで確認してみますと、cdc_mbimとして登録されています。
この状態でモバイルブロードバンドを「接続」をやってみると接続に一瞬成功するのですがすぐに切れてしまいます。usb_modeswitchで確認してみますとモードが2に戻っています。
仕方ないので

$ sudo usb_modeswitch -v 1bc7 -p 1900 -u 1

としてみますと、今度はqmi_wwanとして登録されています。
これで接続してみますとうまく接続されています。

接続が成功している状態

これを永続化させるためにudevに設定を追加します。

$sudo vi /etc/udev/rules.d/15-lte.rules

ATTR{idVendor}=="1bc7", ATTR{idProduct}=="1900", RUN+="/usr/sbin/usb_modeswitch -v 1bc7 -p 1900 -u 1"

これで再起動時に再接続されるようになります。(Wifiを優先させたい場合は自動接続を着ると良いと思います)

書き忘れていることもあるかもしれないのでうまく行かない場合はコメントをください…

埋伏智歯(親不知)を2本抜いたお話

新型コロナウイルスで世間は様々な場面で痛手を負ってますが、抜歯でそれどころではないPG_MANAです。
今回は親知らずを春休みを利用して抜いてきたのでそれの記録をしておきます。
書いて需要があるかはわかんないですが、この雑記は自分でも見返すので後々「あ〜あのときはすごかったなぁ」と振り返るために書いておきます。
これから親不知を抜く人や暇潰しをしたい方に読んでいただければと思います。

抜歯の理由

自分の親不知は、上下4本すべて完全に埋まっていて(完全埋伏歯というらしいです)、レントゲンを見ると見事に斜めになって埋まっています。この内下二本は内側を向いており歯並びに悪影響を及ぼし噛み合わせが悪くなることから、かかりつけ歯科医の先生から大学生での抜歯を勧められていました。抜歯手術と聞いて気が進みませんでしたが、噛み合わせが悪くなって頭痛に悩ませられるのも嫌なので長期休暇を利用して抜くことにしました。
完全に埋伏歯の手術は高度な技術が必要らしく、かかりつけ医の先生では時間がかかってしまうとのことでしたので、別の病院で抜くことになりました。

1本目抜歯当日

さて1本目抜く日が来てしまいました。
朝から「嫌だなぁ〜嫌だなぁ」と言いつつも病院まで自転車で移動しました。
診察が始まり紹介状を渡してレントゲンを撮った後、すぐさま手術が始まりました。
数回麻酔を打たれるんですが、だんだん奥歯の根本に鈍痛が来てその後痺れてきます。
麻酔が効くまで10分位待たされるんですがそれがまた地獄で、いらぬ予想を膨らませて冷や汗が止まらなくなっていきます。
待たされた後、「では始めます〜」と言われて口の中にメスが入ります。歯肉を切るのでメスを使うのは至極当然なのですが、生まれてこのかた口の中にメスを入れるなんて想像もしたことがなかった自分は早くも顔面蒼白。歯肉が開かれエアタービン(キュイーンとなるやつ)を使って親不知を削ります。その後リムービングドライバと呼ばれるマイナスドライバ状の器具で歯を割っていくと言われたんですがこれが一番の地獄でして、ガッツガッツ顎を突かれるので顎が疲弊するわ、「メリメリメリ…パキッ」という口の中で聞きたくない音が顎を伝って直接耳に届くわ、涎が溜まって舌を動かしたくなるがドライバで間違って刺されたらひとたまりもないと思い必死に我慢するわ、とにかく耐える時間が続きました。おかげで背中は汗でびっしょりになりました。時々口から何かを取り出す度に「これで終わりか?」と期待しては再びドライバが入って目をつぶって耐えるを繰り返した後、縫合が行われて終了しました。わずか30分で終了したようです。ガーゼを噛んで圧迫止血した後会計を済ませて(治療費は6000円)病院を後にして薬局で抗生剤と解熱鎮痛剤(ロキソニン)をもらって帰りました。夜までは麻酔が効いてましたが徐々に切れたので鎮痛剤を飲んで寝ました。

抜歯1日後

抜歯の後は腫れると聞いていましたが、大して腫れずに痛みも口内炎のような痛みで鎮痛剤でどうにかなるレベル。口も炎症があって大きくは開きませんが噛むことはできる程度。
「なんとかなりそうだし、柔らかいものなら食べよう」と焼きそばや煮魚を平らげて実家の作業を手伝ってました、後の苦しむとは知らずに…

抜歯2,3日後

朝起きて鎮痛剤を飲んで昼に鎮痛剤が切れた頃から痛みの種類が変わってることに気づきます。口内炎のような広く痛いのではなく、穴が空いた部分がクリティカルに痛い神経痛に変わり激痛になって襲いかかってきます。鋭い痛みは頭痛をも誘って頭と顎を抱えながら寝込む羽目に…鎮痛剤は最低でも6時間開けないといけないので痛みに耐えて時間が経ったら即座に鎮痛剤を飲むを繰り返す日々になり食欲も失せてしまいました。夜中に鎮痛剤が切れて「イッテェェ」と叫びながら起きて鎮痛剤を飲んで効果が出るまで30分程度顎を押さえて耐え、効果が出てきて耐えられる程度に収まり穏やかな眠りについたのもつかの間、4時間しか持たず激痛に叩き起こされ寝不足になりました。それでも段々痛みが引いてきて3日後の昼には耐えられる程度になっていきました、が…

抜歯4〜7日後

今度は抜歯傷付近から非常に不味い汁(アルカリ性だと判断)が出てきて口の中を襲います。
おまけに口の中から強烈な腐敗臭がして、周囲からもしかめっ面をされるのでマスクを室内でも着用するようになりました。
最初は麻酔が打たれた部分が化膿したのかと思いましたがそのような雰囲気でもないので謎の苦汁に苦しむ羽目に…痛みは完全に引かないので唾液が出てそれが苦くなり舌がしびれるような感覚に苦しみそれを中和をしようと余計に唾液が出てまた苦くなるの悪循環に陥り鼻水まで垂らして苦しみました。アルカリ性なら中和すればいいとレモン飲料や梅干しを舐めるなど涙ぐましい努力で耐え抜きました。
後にかかりつけ医の先生に「食べかすが親不知周辺の歯にくっついて腐敗したんですよ」と教えてもらいました。激痛で親不知周辺を触らないように、磨かないようにしていたのと抜歯後調子に乗って色々食べたのが仇になっていたようです。
苦汁を舐め続けて舌も痺れて、おまけに急に肩と顎が凝ってガクガクと震えるので湿布を貼って寝るなどいろいろ辛くて、ろくに思考もまとまらなくなりチマチマGoogle App Engineをいじる程度しかできなくなりました。

抜歯8〜12日後

苦汁は相変わらず出続けご飯も美味しく食べられない日々ですが段々とくさやのような匂いになり味も魚の乳酸発酵したような味になり不味いことに変わらないのですが多少耐えられるようになりました。痛みも大分引いてきて鎮痛剤は手放せないですが気にならない程度になりました。しかしながら炎症は引いてないようで倦怠感に襲われ眠気が取れず午前中は寝ながらボォ〜とコロナショックで乱高下する株価を見て、午後になってApp Engine移行作業をする日々が続きました。眠気も普段より早く来て11:00までは眠りについてることが多くなりました。それでも段々と回復してそろそろ本調子と行こうとした時にその時は来るのです…

2本目抜歯当日

「嫌だなぁ」と思えどその時は来るのです。
診察台によだれかけをつけられて寝かされ、先生が来るのを待ってると前回と違う先生が登場し「抜歯後の調子はどうですか?」と訊かれて、「きつかったです…」と疲れた顔で答えました。抜歯時の縫合糸は本来一週間後に抜いてもらうのですが、今回は抜歯と同時にしてもらおうと「あっ、『バッシ』(抜糸)を先にお願いできますか?」「『バッシ』(抜歯)を先にですね、わかりました〜麻酔しますね〜」「あっ、ごめんなさい、糸の方です」「糸の方ですね、失礼しました」というやり取りもしながら抜糸・麻酔・歯肉切開と進んでいきます。現在の状況を親切に説明してくださり、智歯を砕いて割ってそれから引っこ抜くみたいなのですが、そこで例のマイナスドライバが出てくるわけでてきます。智歯が大きくなかなか割れないため何回も突いている時に勢い余って歯茎に刺さりそうになりながら「アッすみません」と言われて冷や汗をながすなどしているうちに糸で縫って終了。今回も30分程度で終わり、また薬をもらって家に帰りました。前回と違いもう抜かなくて良いという気の軽さはありましたが、明日から苦しまないといけないという暗い気持ちは残りました。

2本目抜歯1日後

朝起きたら頬が腫れてました。
明らかに一本目よりも酷く腫れており周りも見てわかる程度です。
一方で神経痛や口内炎のような痛みがなくただ頬が腫れてそれによる熱を持った痛みがあるだけで鎮痛剤がなくても耐えられる程度でした。しかしこの後が怖いので服用しておきました。
前回の反省を踏まえ食事は栄養ゼリーと野菜ジュースという普段なら絶対食べない、噛まなくていい加工食品のみで直接胃に流し込みます。
倦怠感は相変わらず発生しますが、痛みがないだけマシかなと思いながらこたつで寝るなどしていました。

2本目抜歯2日後

朝起きたら頬がパンパンに腫れてました。それはもう輪郭がわからなくなるほどでおたふく状態です。朝から微熱があり布団で横になっていたところ、親が緊急外来に駆け込むという事態が発生しまして、朝からドタバタしました。命には別状はないもののやはり焦るものでアドレナリンが出て体調不良なんて強制的になかったことにされ発熱も倦怠感もなくなりキビキビ動けました。鎮痛剤より遥かに効くアドレナリン…
午後に無事に帰宅できたわけですが、その日はわけのわからない体調が続きました。
アドレナリンの影響で体はエネルギーに満ち溢れてるしキビキビ動くけど発熱で頭がボォーとして倦怠感はひどいという寝てようか作業しようか悩ましい状況になりました。
とはいえ作業しても仕方ないので寝ました。
食事は相変わらず栄養ゼリーで凍らせて晴れた頬に当てて解かして飲んでました。

2本目抜歯3,4日後

更に頬が腫れ熱も38.1℃も出て汗をダラダラ流しながら布団で寝続ける日々を送りました。
と言っても3日目午前中は発熱していることにも気づかず家の作業を手伝っていたのですが、途中から強い倦怠感に襲われて寝ました。
痛みが我慢できるからという理由で服用を止めていたロキソニンですが、鎮痛目的でなく解熱目的で使用することに。
腫れは首にまで及び呼吸しにくいこともあり、腫れの中にはとても硬い部分もありました。
頬の腫れにより何かを噛むと必ず口の中の皮まで噛んでしまうため、ヨーグルトや栄養ゼリーしか食べれなくなり、さらに口を開けようとすると頬が攣るという人生初めての経験をするはめに…
食べては寝るを繰り返し耐えました。

2本目抜歯5,6日後

腫れも引いてきて、長かったお布団生活も終わり起き上がって作業できるようになりました。
倦怠感はありますが、数日前とは比べ物にならないほどに改善しました。
口も徐々に開くようになりましたが、こちらはまだ時間がかかるようです。

2本目抜歯7日後

この日にかかりつけ医の先生に抜糸してもらい今回の件で病院行くのは最後となりました。
最初に抜いた方は段々と元通りになっていっており、後一週間たてば2本目もほぼいつもどおりに使えるようになるとのことです。
たまに神経痛がする程度で腫れも9割方なくなりました。

感想

抜歯で一ヶ月近く四苦八苦にしたわけですが、新型コロナウイルスでイベントも全滅していたので生活面での悪影響はプログラムがかけなかったくらいです(頭が回らないのでコードがかけない、かけないと何もしてないという感覚が精神を蝕むという悪影響)。
通常の抜歯より遥かにきつかった埋伏智歯抜歯ですが、無事に後遺症に悩まされることもなく治りそうなので良かったです。
今後抜く予定の人は以下のことに気をつけたら良いと思います。

  • 抜歯1日後に食事ができると判断した場合でも肉類は食べない(抜歯部分は歯磨きができないため、そこについて腐ってしまう)
  • 抜歯前に噛まずに食べられるゼリーなどをかっておく(場合によっては全く噛むことができなくなります)
  • 液体歯磨きを口に含んで数分待って吐き出すをすると腐敗臭が減る
  • 痛くなくても抜歯後数日間は処方された解熱鎮痛剤は飲む