Finally I've find out. The problem is kvm source of package
linux-source-2.6.26 does not include the kvm-66-fix-k7-msr2.patch.
kvm source in package kvm-source 72+dfsg-5 seems to be more up to date;
it includes the k7 patch and more, it seems. Look diffs in the
attachment.
I do not know if this is an error on is intended to be this way.
Anyway, rebuilding kvm modules from source packages solve the problem.
Now long term support kernel 2.6.18 boots fine.
m...@fujiko:/tmp$ dpkg -l linux-source* kvm*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Cfg-files/Unpacked/Failed-cfg/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Name Version
Description
+++-=-=-==
ii kvm 72+dfsg-5 Full
virtualization on x86 hardware
un kvm-data none(no
description available)
un kvm-modules none(no
description available)
ii kvm-modules-2.6.26-1-amd6472+dfsg-3+2.6.26-11 kvm
modules for Linux (kernel 2.6.26-1-amd64).
ii kvm-modules-2.6.26-2-amd6472+dfsg-5+2.6.26-15 kvm
modules for Linux (kernel 2.6.26-2-amd64).
ii kvm-source72+dfsg-5 Source
for the KVM driver
un linux-source none(no
description available)
un linux-source-2.6 none(no
description available)
pn linux-source-2.6.22 none(no
description available)
ii linux-source-2.6.26 2.6.26-15 Linux
kernel source for version 2.6.26 with Debian patches
m...@fujiko:/tmp$ tar -xjf /usr/src/linux-source-2.6.26.tar.bz2
m...@fujiko:/tmp$ tar -xjf /usr/src/kvm.tar.bz2
m...@fujiko:/tmp$ diff linux-source-2.6.26/arch/x86/kvm/svm.c modules/kvm/svm.c
20a21
#include kvm_cache_regs.h
29a31,33
#define __ex(x) __kvm_handle_fault_on_reboot(x)
MODULE_INFO(version, kvm-72);
36,39d39
#define DB_VECTOR 1
#define UD_VECTOR 6
#define GP_VECTOR 13
63d62
static void svm_flush_tlb(struct kvm_vcpu *vcpu);
133c132
asm volatile (SVM_CLGI);
---
asm volatile (__ex(SVM_CLGI));
138c137
asm volatile (SVM_STGI);
---
asm volatile (__ex(SVM_STGI));
143c142
asm volatile (SVM_INVLPGA :: a(addr), c(asid));
---
asm volatile (__ex(SVM_INVLPGA) :: a(addr), c(asid));
237,241c236,238
if (svm-next_rip - svm-vmcb-save.rip MAX_INST_SIZE)
printk(KERN_ERR %s: ip 0x%llx next 0x%llx\n,
__func__,
svm-vmcb-save.rip,
svm-next_rip);
---
if (svm-next_rip - kvm_rip_read(vcpu) MAX_INST_SIZE)
printk(KERN_ERR %s: ip 0x%lx next 0x%llx\n,
__func__, kvm_rip_read(vcpu), svm-next_rip);
243c240
vcpu-arch.rip = svm-vmcb-save.rip = svm-next_rip;
---
kvm_rip_write(vcpu, svm-next_rip);
286,287c283,284
struct desc_ptr gdt_descr;
struct desc_struct *gdt;
---
struct kvm_desc_ptr gdt_descr;
struct kvm_desc_struct *gdt;
307c304
gdt = (struct desc_struct *)gdt_descr.address;
---
gdt = (struct kvm_desc_struct *)gdt_descr.address;
455c452,453
}
---
} else
kvm_disable_tdp();
580a579
svm-vcpu.arch.regs[VCPU_REGS_RIP] = save-rip;
615c614
svm-vmcb-save.rip = 0;
---
kvm_rip_write(vcpu, 0);
618a618,619
vcpu-arch.regs_avail = ~0;
vcpu-arch.regs_dirty = ~0;
721,741d721
static void svm_vcpu_decache(struct kvm_vcpu *vcpu)
{
}
static void svm_cache_regs(struct kvm_vcpu *vcpu)
{
struct vcpu_svm *svm = to_svm(vcpu);
vcpu-arch.regs[VCPU_REGS_RAX] = svm-vmcb-save.rax;
vcpu-arch.regs[VCPU_REGS_RSP] = svm-vmcb-save.rsp;
vcpu-arch.rip = svm-vmcb-save.rip;
}
static void svm_decache_regs(struct kvm_vcpu *vcpu)
{
struct vcpu_svm *svm = to_svm(vcpu);
svm-vmcb-save.rax = vcpu-arch.regs[VCPU_REGS_RAX];
svm-vmcb-save.rsp = vcpu-arch.regs[VCPU_REGS_RSP];
svm-vmcb-save.rip = vcpu-arch.rip;
}
883,886d862
unsigned long old_cr4 = to_svm(vcpu)-vmcb-save.cr4;
if (npt_enabled ((old_cr4 ^ cr4) X86_CR4_PGE))
force_new_asid(vcpu);
967c943,945
return to_svm(vcpu)-db_regs[dr];
---
unsigned long val = to_svm(vcpu)-db_regs[dr];
KVMTRACE_2D(DR_READ, vcpu, (u32)dr, (u32)val, handler);
return val;
1026,1032c1004,1011
/*
* FIXME: Tis shouldn't be necessary here, but there is a flush
* missing in the MMU code. Until we find