On 12.03.2013 16:09, Vladimir 'φ-coder/phcoder' Serbinenko wrote:
Hello, all. I've pushed my X201 work to gerrit. It also contains spkmodem and serialice improvements (target-side, like EHCI debug support). Host-side I attach a small patch to redirect clflush to target. Code quality is bad but it already works. Current known issues: speedstep doesn't work S3 doesn't work many ACPI buttons don't work.
You will also need following blobs: descriptor + me firmware VGA BIOS cpu microcode All are extractible from original BIOS by using the extract tool I published previously. cpu_microcode (UUID=3030435f-0000-0000-ff00-000000000000) has a range of ff...ff at the beginning you have to strip. VGA UUID is 3030525f-0000-0000-ff00-000000000000. descriptor and me firmware are files 001_descriptor.bin and 002_me.bin
Not tested: dock
diff --git a/qemu-0.15.x/target-i386/helper.h b/qemu-0.15.x/target-i386/helper.h index 6b518ad..3c1068a 100644 --- a/qemu-0.15.x/target-i386/helper.h +++ b/qemu-0.15.x/target-i386/helper.h @@ -47,6 +47,7 @@ DEF_HELPER_1(lmsw, void, tl) DEF_HELPER_0(clts, void) DEF_HELPER_2(movl_drN_T0, void, int, tl) DEF_HELPER_1(invlpg, void, tl) +DEF_HELPER_1(clflush, void, tl)
DEF_HELPER_3(enter_level, void, int, int, tl) #ifdef TARGET_X86_64 diff --git a/qemu-0.15.x/target-i386/op_helper.c b/qemu-0.15.x/target-i386/op_helper.c index 1823c74..20d8d2d 100644 --- a/qemu-0.15.x/target-i386/op_helper.c +++ b/qemu-0.15.x/target-i386/op_helper.c @@ -3053,6 +3053,12 @@ void helper_invlpg(target_ulong addr) tlb_flush_page(env, addr); }
+void helper_clflush(target_ulong addr) +{
- if (serialice_active)
serialice_handle_clflush ((uint32_t)addr);
+}
void helper_rdtsc(void) { uint64_t val; diff --git a/qemu-0.15.x/target-i386/translate.c b/qemu-0.15.x/target-i386/translate.c index ccef381..c23585a 100644 --- a/qemu-0.15.x/target-i386/translate.c +++ b/qemu-0.15.x/target-i386/translate.c @@ -7551,6 +7551,9 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) if (!(s->cpuid_features & CPUID_CLFLUSH)) goto illegal_op; gen_lea_modrm(s, modrm, ®_addr, &offset_addr);
gen_helper_clflush(cpu_A0);
gen_jmp_im(s->pc - s->cs_base);
gen_eob(s); } break; default: