木曜特番!! オリンピックに負けるな!! outb_p()の正体迫る!!

※今回の番組は,特に何か起こるわけではないです。


結論から言うと,outb()とslow_down_io()を使用するインライン関数です。
というか,番組の初っぱなで結論から言うって,どんな番組だよ。
番組だったら,できるだけひっぱるのが常套手段なのに。
ま,いいや。


カーネルのソース眺めていて,outb_p()命令がちょいちょいでてきます。
この方は,どちら様??
わたくしの非力さゆえ,gtags使っても,grepしても,見つからず。
道中,ack-grepというパッケージを発見,インストール。
これは,慣れれば便利そうですね。


アセンブリで定義されているのか?とも思ったけど,
Web使わしてもらって調べるとマクロ定義されていることがわかりました。


include/asm-i386/io.h で定義されているBUILDIOマクロで
作られるようです。眺めてみても,ちんぷんかんぷん。
脳内展開などできるはずもなく,早速,コピペ。
だもんで,gcc -E から astyle への連携技(途中,手動整形含む)
コード整形ツールってはじめて使いまんた。
BUILDIO マクロ内で,__BUILDIO マクロが使われていることも
わかりまんた。


さー,ひっぱってひっぱって出来る限りひっぱったけど,もう無理ぽ。
以下が結果です。
(日記にコード載っけるとなんかかっくいい気がするので載せています。いえい。)

/*
 * SLOW_IO_BY_JUMPING は追ってないので,必ずelseになってしまうので,
 * 展開しないで,載せてます。slow_down_io() 内で使用されるマクロ定義でごわす。
 */
#ifdef SLOW_IO_BY_JUMPING
#define __SLOW_DOWN_IO "jmp 1f; 1: jmp 1f; 1:"
#else
#define __SLOW_DOWN_IO "outb %%al,$0x80;"
#endif

static inline void slow_down_io(void) {
  __asm__ __volatile__("outb %%al,$0x80;" : : );
}

static inline void outb_local(unsigned char value, int port) {
  __asm__ __volatile__("out" "b" " %" "b" "0, %w1" : : "a"(value), "Nd"(port));
}

static inline unsigned char inb_local(int port) {
  unsigned char value;
  __asm__ __volatile__("in" "b" " %w1, %" "b" "0" : "=a"(value) : "Nd"(port));
  return value;
}

static inline void outb_local_p(unsigned char value, int port) {
  outb_local(value, port);
  slow_down_io();
}

static inline unsigned char inb_local_p(int port) {
  unsigned char value = inb_local(port);
  slow_down_io();
  return value;
}

static inline void outb(unsigned char value, int port) {
  outb_local(value, port);
}

static inline unsigned char inb(int port) {
  return inb_local(port);
}

static inline void outb_p(unsigned char value, int port) {
  outb(value, port);
  slow_down_io();
}

static inline unsigned char inb_p(int port) {
  unsigned char value = inb(port);
  slow_down_io();
  return value;
}

static inline void outsb(int port, const void *addr, unsigned long count) {
  __asm__ __volatile__("rep; outs" "b" : "+S"(addr), "+c"(count) : "d"(port));
}

static inline void insb(int port, void *addr, unsigned long count) {
  __asm__ __volatile__("rep; ins" "b" : "+D"(addr), "+c"(count) : "d"(port));
}

協賛

  • Linux カーネル開発を頑張っている皆さん。
  • gcc
  • astyle
  • その他たくさんの,GNU のツールの皆さん。

まとめ

いやー,オリンピックおもしろいねぇ。
陸上競技が始まるともっとおもしろくなりそうだねぇ。


サッカー男子は,もうひどい。若手芸人11人でチーム作っても
いい勝負しそう。ガツガツしているという意味で。
でも,選手には責任はない気もする,たぶんだけど。
指導者だろうなぁ。
てか,この日記で以前言ったような気がするなぁ。
いずれアメリカに越されるって。
ほんとに越されてどないすんねん!!


昔はサッカーでは,アメリカには余裕で買ってたのに。。。
ま,Jリーグの試合みたら,わかるか。
中田がいなくなって終わった感があるねぇ。
アトランタ五輪でブラジルに勝ったときは,興奮して感動したのに。
友達と映画見に行く予定で,友達がバイクで家に来てたけど,
サッカーが終わるまで一緒にみてたもんなぁ。号外も配られてたし。


はぁ,エライ人達が,なんでアメリカに追い越されたか?
なんで水泳で日本が活躍しているのか?
理由を解明出来ない限り,追いつけないだろうなぁ。