[Spice-devel] [PATCH 09/17] Save FPU on stack, not in pdev

alexl at redhat.com alexl at redhat.com
Tue Sep 14 12:08:59 PDT 2010


From: Alexander Larsson <alexl at redhat.com>

We can't use the global pdev FPUSave, because multiple processes
could be calling the sse2 using code in parallel.
---
 display/qxldd.h |    2 --
 display/res.c   |   31 +++++++++++++++++--------------
 2 files changed, 17 insertions(+), 16 deletions(-)

diff --git a/display/qxldd.h b/display/qxldd.h
index f09814f..7f254f8 100644
--- a/display/qxldd.h
+++ b/display/qxldd.h
@@ -313,8 +313,6 @@ typedef struct PDev {
     Ring update_trace;
     UpdateTrace update_trace_items[NUM_UPDATE_TRACE_ITEMS];
 
-    UINT8 FPUSave[16 * 4 + 15];
-
     UINT32 n_surfaces;
     SurfaceInfo surface0_info;
 
diff --git a/display/res.c b/display/res.c
index ceba034..4202daa 100644
--- a/display/res.c
+++ b/display/res.c
@@ -1715,9 +1715,9 @@ static void FreeBitmapImage(PDev *pdev, Resource *res) // todo: defer
     DEBUG_PRINT((pdev, 13, "%s: done\n", __FUNCTION__));
 }
 
-static _inline void RestoreFPU(PDev *pdev)
+static _inline void RestoreFPU(PDev *pdev, UINT8 FPUSave[])
 {
-    void *align_addr =  (void *)ALIGN((size_t)(&pdev->FPUSave), SSE_ALIGN);
+    void *align_addr =  (void *)ALIGN((size_t)(FPUSave), SSE_ALIGN);
 
     _asm
     {
@@ -1730,9 +1730,9 @@ static _inline void RestoreFPU(PDev *pdev)
     }
 }
 
-static _inline void SaveFPU(PDev *pdev)
+static _inline void SaveFPU(PDev *pdev, UINT8 FPUSave[])
 {
-    void *align_addr =  (void *)ALIGN((size_t)(&pdev->FPUSave), SSE_ALIGN);
+    void *align_addr =  (void *)ALIGN((size_t)(FPUSave), SSE_ALIGN);
 
     _asm
     {
@@ -1767,7 +1767,6 @@ static _inline Resource *GetBitmapImage(PDev *pdev, SURFOBJ *surf, XLATEOBJ *col
     UINT8 *src_end;
     UINT8 *dest;
     UINT8 *dest_end;
-    BOOL use_sse = FALSE;
 
     DEBUG_PRINT((pdev, 12, "%s\n", __FUNCTION__));
     ASSERT(pdev, width > 0 && height > 0);
@@ -1801,17 +1800,21 @@ static _inline Resource *GetBitmapImage(PDev *pdev, SURFOBJ *surf, XLATEOBJ *col
     alloc_size = height * line_size;
 
     if (have_sse2 && alloc_size >= 1024) {
-        use_sse = TRUE;
-        SaveFPU(pdev);
-    }
+        UINT8 FPUSave[16 * 4 + 15];
 
-    for (; src != src_end; src -= surf->lDelta, alloc_size -= line_size) {
-        PutBytesAlign(pdev, &chunk, &dest, &dest_end, src, line_size,
-                      &pdev->Res->num_bits_pages, alloc_size, line_size, TRUE);
-    }
+        SaveFPU(pdev, FPUSave);
+
+	for (; src != src_end; src -= surf->lDelta, alloc_size -= line_size) {
+	  PutBytesAlign(pdev, &chunk, &dest, &dest_end, src, line_size,
+			&pdev->Res->num_bits_pages, alloc_size, line_size, TRUE);
+	}
 
-    if (use_sse) {
-        RestoreFPU(pdev);
+        RestoreFPU(pdev, FPUSave);
+    } else {
+        for (; src != src_end; src -= surf->lDelta, alloc_size -= line_size) {
+            PutBytesAlign(pdev, &chunk, &dest, &dest_end, src, line_size,
+                          &pdev->Res->num_bits_pages, alloc_size, line_size, FALSE);
+        }
     }
 
     GetPallette(pdev, &internal->image.bitmap, color_trans);
-- 
1.7.2.2



More information about the Spice-devel mailing list