GeekFactory

int128.hatenablog.com

xen-sources-2.6.27-r4のビルド

Xenの公式カーネルは2.6.18止まりですが、各方面で2.6.27のパッチが出ています。

xen-patches-2.6.27-6.tar.bz2
xen-sources-2.6.27-r4.ebuild

http://code.google.com/p/gentoo-xen-kernel/downloads/list

ビルド手順はこちらのページを参考にしました:

ebuild /usr/portage/sys-kernel/xen-sources/xen-sources-2.6.27-r2.ebuild digest
emerge xen-sources

http://www.stbbs.net/blog/2008/11/xen-dom0-linux-2627.html

私の環境では最後のリンクに失敗しました。

arch/x86/kernel/built-in.o: In function `show_cpuinfo':
proc.c:(.text+0xc0a0): undefined reference to `cpufreq_quick_get'
make: *** [.tmp_vmlinux1] Error 1

cpufreq_quick_get()はcpufreq.hで宣言されていますが、CONFIG_CPU_FREQが有効でない場合は常に0を返す関数で置き換えられるはずです。

/* query the last known CPU freq (in kHz). If zero, cpufreq couldn't detect it */
#if defined(CONFIG_CPU_FREQ) || defined(CONFIG_PROCESSOR_EXTERNAL_CONTROL)
unsigned int cpufreq_quick_get(unsigned int cpu);
#else
static inline unsigned int cpufreq_quick_get(unsigned int cpu)
{
        return 0;
}
#endif

CONFIG_PROCESSOR_EXTERNAL_CONTROLが有効になっているのが原因ですね。これを無効にして再ビルドします。

というのが正しい方法ですが、面倒なので arch/x86/kernel/cpu/proc.c を書き換えてごまかしました。

Xenを使う場合は CONFIG_PROCESSOR_EXTERNAL_CONTROL が有効になるようです。

config PROCESSOR_EXTERNAL_CONTROL
        bool
        depends on (X86 || IA64) && XEN
        default y

これを無効にすると影響が出ると考えられるため、arch/x86/kernel/cpu/proc.c を書き換えます。

        if (cpu_has(c, X86_FEATURE_TSC)) {
                unsigned int freq = 0;//cpufreq_quick_get(cpu);

                if (!freq)
                        freq = cpu_khz;
                seq_printf(m, "cpu MHz\t\t: %u.%03u\n",
                           freq / 1000, (freq % 1000));
        }

とりあえず動いています。

Linux ***** 2.6.27-xen-r4 #4 SMP Thu Dec 18 23:36:50 JST 2008 x86_64 Intel(R) Atom(TM) CPU 330 @ 1.60GHz GenuineIntel GNU/Linux