public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Cleanup macros in qemu-kvm.c
@ 2006-12-09  3:32 Anthony Liguori
       [not found] ` <457A2E4C.4080303-NZpS4cJIG2HvQtjrzfazuQ@public.gmane.org>
  0 siblings, 1 reply; 2+ messages in thread
From: Anthony Liguori @ 2006-12-09  3:32 UTC (permalink / raw)
  To: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f

[-- Attachment #1: Type: text/plain, Size: 284 bytes --]

Howdy,

Macros are pretty gnarly especially when they aren't needed.  This patch 
replaces a few macros with static functions for synchronizing segment 
register state in qemu-kvm.c within QEMU.

I tested save/restore with a Win2k guest and all seems well.

Regards,

Anthony Liguori

[-- Attachment #2: qemu-kvm-macros.diff --]
[-- Type: text/x-patch, Size: 5575 bytes --]

diff -r 08586b8ba75c qemu/qemu-kvm.c
--- a/qemu/qemu-kvm.c	Fri Dec 08 14:27:37 2006 -0600
+++ b/qemu/qemu-kvm.c	Fri Dec 08 21:30:52 2006 -0600
@@ -72,6 +72,55 @@ static int get_msr_entry(struct kvm_msr_
 #else
 #define MSR_COUNT 5
 #endif
+
+static void set_v8086_seg(struct kvm_segment *lhs, const SegmentCache *rhs)
+{
+    lhs->selector = rhs->selector;
+    lhs->base = rhs->base;
+    lhs->limit = rhs->limit;
+    lhs->type = 3;
+    lhs->present = 1;
+    lhs->dpl = 3;
+    lhs->db = 0;
+    lhs->s = 1;
+    lhs->l = 0;
+    lhs->g = 0;
+    lhs->avl = 0;
+    lhs->unusable = 0;
+}
+
+static void set_seg(struct kvm_segment *lhs, const SegmentCache *rhs)
+{
+    unsigned flags = rhs->flags;
+    lhs->selector = rhs->selector;
+    lhs->base = rhs->base;
+    lhs->limit = rhs->limit;
+    lhs->type = (flags >> DESC_TYPE_SHIFT) & 15;
+    lhs->present = (flags & DESC_P_MASK) != 0;
+    lhs->dpl = rhs->selector & 3;
+    lhs->db = (flags >> DESC_B_SHIFT) & 1;
+    lhs->s = (flags & DESC_S_MASK) != 0;
+    lhs->l = (flags >> DESC_L_SHIFT) & 1;
+    lhs->g = (flags & DESC_G_MASK) != 0;
+    lhs->avl = (flags & DESC_AVL_MASK) != 0;
+    lhs->unusable = 0;
+}
+
+static void get_seg(SegmentCache *lhs, const struct kvm_segment *rhs)
+{
+    lhs->selector = rhs->selector;
+    lhs->base = rhs->base;
+    lhs->limit = rhs->limit;
+    lhs->flags =
+	(rhs->type << DESC_TYPE_SHIFT)
+	| (rhs->present * DESC_P_MASK)
+	| (rhs->dpl << DESC_DPL_SHIFT)
+	| (rhs->db << DESC_B_SHIFT)
+	| (rhs->s * DESC_S_MASK)
+	| (rhs->l << DESC_L_SHIFT)
+	| (rhs->g * DESC_G_MASK)
+	| (rhs->avl * DESC_AVL_MASK);
+}
 
 static void load_regs(CPUState *env)
 {
@@ -110,55 +159,20 @@ static void load_regs(CPUState *env)
 
     memcpy(sregs.interrupt_bitmap, env->kvm_interrupt_bitmap, sizeof(sregs.interrupt_bitmap));
 
-#define set_seg(var, seg)	\
-  do {				    \
-    unsigned flags = env->seg.flags; \
-    sregs.var.selector = env->seg.selector; \
-    sregs.var.base = env->seg.base; \
-    sregs.var.limit = env->seg.limit; \
-    sregs.var.type = (flags >> DESC_TYPE_SHIFT) & 15 ; \
-    sregs.var.present = (flags & DESC_P_MASK) != 0; \
-    sregs.var.dpl = env->seg.selector & 3; \
-    sregs.var.db = (flags >> DESC_B_SHIFT) & 1; \
-    sregs.var.s = (flags & DESC_S_MASK) != 0 ;   \
-    sregs.var.l = (flags >> DESC_L_SHIFT) & 1;    \
-    sregs.var.g = (flags & DESC_G_MASK) != 0;      \
-    sregs.var.avl = (flags & DESC_AVL_MASK) != 0; \
-    sregs.var.unusable = 0; \
-  } while (0)
-
-
-#define set_v8086_seg(var, seg) \
-  do { \
-    sregs.var.selector = env->seg.selector; \
-    sregs.var.base = env->seg.base; \
-    sregs.var.limit = env->seg.limit; \
-    sregs.var.type = 3; \
-    sregs.var.present = 1; \
-    sregs.var.dpl = 3; \
-    sregs.var.db = 0; \
-    sregs.var.s = 1; \
-    sregs.var.l = 0; \
-    sregs.var.g = 0; \
-    sregs.var.avl = 0; \
-    sregs.var.unusable = 0; \
-  } while (0)
-
-
     if ((env->eflags & VM_MASK)) {
-	    set_v8086_seg(cs, segs[R_CS]);
-	    set_v8086_seg(ds, segs[R_DS]);
-	    set_v8086_seg(es, segs[R_ES]);
-	    set_v8086_seg(fs, segs[R_FS]);
-	    set_v8086_seg(gs, segs[R_GS]);
-	    set_v8086_seg(ss, segs[R_SS]);
+	    set_v8086_seg(&sregs.cs, &env->segs[R_CS]);
+	    set_v8086_seg(&sregs.ds, &env->segs[R_DS]);
+	    set_v8086_seg(&sregs.es, &env->segs[R_ES]);
+	    set_v8086_seg(&sregs.fs, &env->segs[R_FS]);
+	    set_v8086_seg(&sregs.gs, &env->segs[R_GS]);
+	    set_v8086_seg(&sregs.ss, &env->segs[R_SS]);
     } else {
-	    set_seg(cs, segs[R_CS]);
-	    set_seg(ds, segs[R_DS]);
-	    set_seg(es, segs[R_ES]);
-	    set_seg(fs, segs[R_FS]);
-	    set_seg(gs, segs[R_GS]);
-	    set_seg(ss, segs[R_SS]);
+	    set_seg(&sregs.cs, &env->segs[R_CS]);
+	    set_seg(&sregs.ds, &env->segs[R_DS]);
+	    set_seg(&sregs.es, &env->segs[R_ES]);
+	    set_seg(&sregs.fs, &env->segs[R_FS]);
+	    set_seg(&sregs.gs, &env->segs[R_GS]);
+	    set_seg(&sregs.ss, &env->segs[R_SS]);
 
 	    if (env->cr[0] & CR0_PE_MASK) {
 		/* force ss cpl to cs cpl */
@@ -168,8 +182,8 @@ static void load_regs(CPUState *env)
 	    }
     }
 
-    set_seg(tr, tr);
-    set_seg(ldt, ldt);
+    set_seg(&sregs.tr, &env->tr);
+    set_seg(&sregs.ldt, &env->ldt);
 
     sregs.idt.limit = env->idt.limit;
     sregs.idt.base = env->idt.base;
@@ -240,29 +254,15 @@ static void save_regs(CPUState *env)
 
     memcpy(env->kvm_interrupt_bitmap, sregs.interrupt_bitmap, sizeof(env->kvm_interrupt_bitmap));
 
-#define get_seg(var, seg) \
-    env->seg.selector = sregs.var.selector; \
-    env->seg.base = sregs.var.base; \
-    env->seg.limit = sregs.var.limit ; \
-    env->seg.flags = \
-	(sregs.var.type << DESC_TYPE_SHIFT) \
-	| (sregs.var.present * DESC_P_MASK) \
-	| (sregs.var.dpl << DESC_DPL_SHIFT) \
-	| (sregs.var.db << DESC_B_SHIFT) \
-	| (sregs.var.s * DESC_S_MASK) \
-	| (sregs.var.l << DESC_L_SHIFT) \
-	| (sregs.var.g * DESC_G_MASK) \
-	| (sregs.var.avl * DESC_AVL_MASK)
-    
-    get_seg(cs, segs[R_CS]);
-    get_seg(ds, segs[R_DS]);
-    get_seg(es, segs[R_ES]);
-    get_seg(fs, segs[R_FS]);
-    get_seg(gs, segs[R_GS]);
-    get_seg(ss, segs[R_SS]);
-
-    get_seg(tr, tr);
-    get_seg(ldt, ldt);
+    get_seg(&env->segs[R_CS], &sregs.cs);
+    get_seg(&env->segs[R_DS], &sregs.ds);
+    get_seg(&env->segs[R_ES], &sregs.es);
+    get_seg(&env->segs[R_FS], &sregs.fs);
+    get_seg(&env->segs[R_GS], &sregs.gs);
+    get_seg(&env->segs[R_SS], &sregs.ss);
+
+    get_seg(&env->tr, &sregs.tr);
+    get_seg(&env->ldt, &sregs.ldt);
     
     env->idt.limit = sregs.idt.limit;
     env->idt.base = sregs.idt.base;

[-- Attachment #3: Type: text/plain, Size: 347 bytes --]

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV

[-- Attachment #4: Type: text/plain, Size: 186 bytes --]

_______________________________________________
kvm-devel mailing list
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
https://lists.sourceforge.net/lists/listinfo/kvm-devel

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] Cleanup macros in qemu-kvm.c
       [not found] ` <457A2E4C.4080303-NZpS4cJIG2HvQtjrzfazuQ@public.gmane.org>
@ 2006-12-10  9:37   ` Avi Kivity
  0 siblings, 0 replies; 2+ messages in thread
From: Avi Kivity @ 2006-12-10  9:37 UTC (permalink / raw)
  To: Anthony Liguori; +Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f

Anthony Liguori wrote:
> Howdy,
>
> Macros are pretty gnarly especially when they aren't needed.  This 
> patch replaces a few macros with static functions for synchronizing 
> segment register state in qemu-kvm.c within QEMU.
>
> I tested save/restore with a Win2k guest and all seems well.

Applied, thanks.

-- 
error compiling committee.c: too many arguments to function


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2006-12-10  9:37 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-12-09  3:32 [PATCH] Cleanup macros in qemu-kvm.c Anthony Liguori
     [not found] ` <457A2E4C.4080303-NZpS4cJIG2HvQtjrzfazuQ@public.gmane.org>
2006-12-10  9:37   ` Avi Kivity

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox