ablog

不器用で落着きのない技術者のメモ

Oracle VM で使われている Xen のソースを読む

Oracle VM 3.2.7 で使われている Xen のバージョンを調べる

2.2 Oracle VM 3.1.1の新機能
Xenハイパーバイザの更新: Xenはリリース4.1.2に更新されています。

2 Oracle VMの新機能

と製品マニュアルに書かれている。


Note:1567537.1 Oracle VM 3.x major release/patch update version information
からリンクされている Oracle VM Server の MOS KB (Readme) を 3.2.8、3.2.7、3.2.6 と見ていくと、3.2.6 で Xen 4.1.3-25.el5.53 に上がっているようだ。


Oracle VM Server 3.2.7 の Dom0 で確認してみると、

# cat /etc/issue
Oracle VM server release 3.2.7
Kernel \r on an \m

# xm info
...
xen_major              : 4
xen_minor              : 1
xen_extra              : .3OVM

Xen 4.1.3 になっている。

Xen 4.1.3のソースを読む

Xen Project Source Repositories から xenbits.xen.org Git - xen.git/summary に行って、xenbits.xen.org Git - xen.git/commit から tree をクリックして、xenbits.xen.org Git - xen.git/tree を見れば良さそう。

Xen のソースを git リポジトリから clone する

  • clone する
$ mkdir xen
$ cd xen
$ git clone git://xenbits.xen.org/xen.git
Initialized empty Git repository in /home/yazekats/Documents/github/xen/xen/.git/
remote: Counting objects: 296060, done.
remote: Compressing objects: 100% (64343/64343), done.
remote: Total 296060 (delta 233240), reused 288747 (delta 226994)
Receiving objects: 100% (296060/296060), 57.24 MiB | 402 KiB/s, done.
Resolving deltas: 100% (233240/233240), done.
  • 確認してみる
$ ls -l
total 304
-rw-rw-r--  1 yazekats yazekats  3070 Aug 31 16:30 CODING_STYLE
-rw-rw-r--  1 yazekats yazekats 19866 Aug 31 16:30 COPYING
-rw-rw-r--  1 yazekats yazekats   484 Aug 31 16:30 CREDITS
-rw-rw-r--  1 yazekats yazekats  9863 Aug 31 16:30 Config.mk
-rw-rw-r--  1 yazekats yazekats 10160 Aug 31 16:30 MAINTAINERS
-rw-rw-r--  1 yazekats yazekats  7809 Aug 31 16:30 Makefile
-rw-rw-r--  1 yazekats yazekats  9887 Aug 31 16:30 README
-rwxrwxr-x  1 yazekats yazekats   120 Aug 31 16:30 autogen.sh
drwxrwxr-x  2 yazekats yazekats  4096 Aug 31 16:30 config
-rwxrwxr-x  1 yazekats yazekats 44826 Aug 31 16:30 config.guess
-rwxrwxr-x  1 yazekats yazekats 35543 Aug 31 16:30 config.sub
-rwxrwxr-x  1 yazekats yazekats 95633 Aug 31 16:30 configure
-rw-rw-r--  1 yazekats yazekats   896 Aug 31 16:30 configure.ac
drwxrwxr-x  5 yazekats yazekats  4096 Aug 31 16:30 docs
drwxrwxr-x  3 yazekats yazekats  4096 Aug 31 16:30 extras
-rw-rw-r--  1 yazekats yazekats   712 Aug 31 16:30 install.sh
drwxrwxr-x  2 yazekats yazekats  4096 Aug 31 16:30 m4
drwxrwxr-x  3 yazekats yazekats  4096 Aug 31 16:30 misc
drwxrwxr-x  2 yazekats yazekats  4096 Aug 31 16:30 scripts
drwxrwxr-x  8 yazekats yazekats  4096 Aug 31 16:30 stubdom
drwxrwxr-x 30 yazekats yazekats  4096 Aug 31 16:30 tools
drwxrwxr-x  3 yazekats yazekats  4096 Aug 31 16:30 unmodified_drivers
-rwxrwxr-x  1 yazekats yazekats   175 Aug 31 16:30 version.sh
drwxrwxr-x  9 yazekats yazekats  4096 Aug 31 16:30 xen
  • ちょっとソースを覗いてみる
/******************************************************************************
 * ioport_emulate.c
 * 
 * Handle I/O port access quirks of various platforms.
 */

#include <xen/config.h>
#include <xen/init.h>
#include <xen/sched.h>
#include <xen/dmi.h>

static void ioemul_handle_proliant_quirk(
    u8 opcode, char *io_emul_stub, struct cpu_user_regs *regs)
{
    uint16_t port = regs->edx;
    uint8_t value = regs->eax;

    if ( (opcode != 0xee) || (port != 0xcd4) || !(value & 0x80) )
        return;

    /*    pushf */
    io_emul_stub[0] = 0x9c;
    /*    cli */
    io_emul_stub[1] = 0xfa;
    /*    out %al,%dx */
    io_emul_stub[2] = 0xee;
    /* 1: in %dx,%al */
    io_emul_stub[3] = 0xec;
    /*    test $0x80,%al */
    io_emul_stub[4] = 0xa8;
    io_emul_stub[5] = 0x80;
    /*    jnz 1b */
    io_emul_stub[6] = 0x75;
    io_emul_stub[7] = 0xfb;
    /*    popf */
    io_emul_stub[8] = 0x9d;
    /*    ret */
    io_emul_stub[9] = 0xc3;

低レイヤー感をビシビシ感じますねw