From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47936) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZC7IE-0001Jt-1N for qemu-devel@nongnu.org; Mon, 06 Jul 2015 10:22:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZC7I6-0000LF-NG for qemu-devel@nongnu.org; Mon, 06 Jul 2015 10:22:45 -0400 Received: from mail-wg0-x229.google.com ([2a00:1450:400c:c00::229]:35738) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZC7I6-0000Kq-EM for qemu-devel@nongnu.org; Mon, 06 Jul 2015 10:22:38 -0400 Received: by wgjx7 with SMTP id x7so141675212wgj.2 for ; Mon, 06 Jul 2015 07:22:38 -0700 (PDT) Received: from 640k.lan (dynamic-adsl-94-39-132-37.clienti.tiscali.it. [94.39.132.37]) by mx.google.com with ESMTPSA id fq7sm47514674wic.5.2015.07.06.07.22.36 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 06 Jul 2015 07:22:37 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Mon, 6 Jul 2015 16:22:18 +0200 Message-Id: <1436192541-65335-11-git-send-email-pbonzini@redhat.com> In-Reply-To: <1436192541-65335-1-git-send-email-pbonzini@redhat.com> References: <1436192541-65335-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PULL 10/13] target-i386: register a separate KVM address space including SMRAM regions List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Signed-off-by: Paolo Bonzini --- target-i386/kvm.c | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/target-i386/kvm.c b/target-i386/kvm.c index bc781c8..952b493 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -22,7 +22,7 @@ #include "qemu-common.h" #include "sysemu/sysemu.h" -#include "sysemu/kvm.h" +#include "sysemu/kvm_int.h" #include "kvm_i386.h" #include "cpu.h" #include "exec/gdbstub.h" @@ -845,6 +845,40 @@ static int kvm_get_supported_msrs(KVMState *s) return ret; } +static Notifier smram_machine_done; +static KVMMemoryListener smram_listener; +static AddressSpace smram_address_space; +static MemoryRegion smram_as_root; +static MemoryRegion smram_as_mem; + +static void register_smram_listener(Notifier *n, void *unused) +{ + MemoryRegion *smram = + (MemoryRegion *) object_resolve_path("/machine/smram", NULL); + + /* Outer container... */ + memory_region_init(&smram_as_root, OBJECT(kvm_state), "mem-container-smram", ~0ull); + memory_region_set_enabled(&smram_as_root, true); + + /* ... with two regions inside: normal system memory with low + * priority, and... + */ + memory_region_init_alias(&smram_as_mem, OBJECT(kvm_state), "mem-smram", + get_system_memory(), 0, ~0ull); + memory_region_add_subregion_overlap(&smram_as_root, 0, &smram_as_mem, 0); + memory_region_set_enabled(&smram_as_mem, true); + + if (smram) { + /* ... SMRAM with higher priority */ + memory_region_add_subregion_overlap(&smram_as_root, 0, smram, 10); + memory_region_set_enabled(smram, true); + } + + address_space_init(&smram_address_space, &smram_as_root, "KVM-SMRAM"); + kvm_memory_listener_register(kvm_state, &smram_listener, + &smram_address_space, 1); +} + int kvm_arch_init(MachineState *ms, KVMState *s) { uint64_t identity_base = 0xfffbc000; @@ -903,6 +937,11 @@ int kvm_arch_init(MachineState *ms, KVMState *s) return ret; } } + + if (kvm_check_extension(s, KVM_CAP_X86_SMM)) { + smram_machine_done.notify = register_smram_listener; + qemu_add_machine_init_done_notifier(&smram_machine_done); + } return 0; } -- 1.8.3.1