[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

xorg-server: Changes to 'debian-unstable'



 GL/glx/glxdri.c                                                             |   17 
 debian/changelog                                                            |   25 +
 debian/patches/15_X86EMU-added-blacklist-for-I-O-port-in-0-0xFF-range.patch |  190 ++++++++
 debian/patches/16_X86EMU-pass-the-correct-bus-dev-fn-tag-to-pci-emula.patch |   96 ++++
 debian/patches/17_x86emu_handle_cpuid.patch                                 |  230 ++++++++++
 debian/patches/series                                                       |    3 
 exa/exa.c                                                                   |    2 
 exa/exa_accel.c                                                             |    2 
 exa/exa_render.c                                                            |    1 
 include/xkbsrv.h                                                            |   16 
 xkb/xkbActions.c                                                            |    9 
 xkb/xkbUtils.c                                                              |   23 -
 12 files changed, 588 insertions(+), 26 deletions(-)

New commits:
commit fa82a1ac6d1544be1654abc182b9fbd347c68156
Author: Julien Cristau <jcristau@debian.org>
Date:   Tue Apr 1 17:48:30 2008 +0200

    Update changelog with cherry-picked patches

diff --git a/debian/changelog b/debian/changelog
index ecdcc51..689b0d3 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -5,6 +5,13 @@ xorg-server (2:1.4.1~git20080131-3) UNRELEASED; urgency=low
     stuck (closes: #473165).
   * xkb: when copying the keymap, make sure the structs default to 0/NULL
     (cherry-picked from upstream).  Fixes a crash and closes: #461783.
+  * __glXDRIbindTexImage: Fail if no texture bound to pixmap's texture target
+    (cherry-picked from upstream).
+  * EXA: Fix off-by-one in polyline drawing (cherry-picked from upstream).
+  * EXA: Skip empty glyphs (cherry-picked from upstream).
+  * Fix overly-restrictive integer overflow check in EXA pixmap creation
+    (cherry-picked from upstream).  Fixes BadAlloc errors returned by
+    XCreatePixmap for pixmaps of width 8192 or greater (closes: #471782).
 
   Following patches by Bart Trojanowski, stolen from the ubuntu package:
   * 15_X86EMU-added-blacklist-for-I-O-port-in-0-0xFF-range.patch

commit c62a00cffab4b588b4574418610e7344c575fc12
Author: Eric Anholt <eric@anholt.net>
Date:   Fri Aug 17 12:14:16 2007 -0700

    Fix overly-restrictive integer overflow check in EXA pixmap creation.
    
    The result was that at 32bpp, pixmaps of width 8192 or greater couldn't be
    created, due to treating a pitch value as a width.

diff --git a/exa/exa.c b/exa/exa.c
index aa42b92..b2faf2f 100644
--- a/exa/exa.c
+++ b/exa/exa.c
@@ -253,7 +253,7 @@ exaCreatePixmap(ScreenPtr pScreen, int w, int h, int depth)
 				     pExaScr->info->pixmapPitchAlign);
     pExaPixmap->fb_size = pExaPixmap->fb_pitch * h;
 
-    if (pExaPixmap->fb_pitch > 32767) {
+    if (pExaPixmap->fb_pitch > 131071) {
 	fbDestroyPixmap(pPixmap);
 	return NULL;
     }

commit 6763ecba754eb0e88c3c78a2833e30806709c21c
Author: Michel Dänzer <michel@tungstengraphics.com>
Date:   Thu Oct 18 17:44:48 2007 +0200

    EXA: Skip empty glyphs.

diff --git a/exa/exa_render.c b/exa/exa_render.c
index 2dd3fc1..ad1c02b 100644
--- a/exa/exa_render.c
+++ b/exa/exa_render.c
@@ -1184,6 +1184,7 @@ exaGlyphs (CARD8	op,
 	    y1 = y - glyph->info.y;
 
 	    if (x1 >= pCmpDrw->width || y1 >= pCmpDrw->height ||
+		glyph->info.width == 0 || glyph->info.height == 0 ||
 		(x1 + glyph->info.width) <= 0 || (y1 + glyph->info.height) <= 0)
 		goto nextglyph;
 

commit 4aea0c011c6888b1d826f9678e79aa5d73cebf9c
Author: Pierre Willenbrock <pierre@pirsoft.dnsalias.org>
Date:   Tue Oct 23 16:45:13 2007 +0200

    EXA: Fix off-by-one in polyline drawing.

diff --git a/exa/exa_accel.c b/exa/exa_accel.c
index aed4e42..e8444c6 100644
--- a/exa/exa_accel.c
+++ b/exa/exa_accel.c
@@ -535,7 +535,7 @@ exaPolylines(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
     x1 = ppt[0].x;
     y1 = ppt[0].y;
     /* If we have any non-horizontal/vertical, fall back. */
-    for (i = 0; i < npt; i++) {
+    for (i = 0; i < npt - 1; i++) {
 	if (mode == CoordModePrevious) {
 	    x2 = x1 + ppt[i + 1].x;
 	    y2 = y1 + ppt[i + 1].y;

commit a9173e10b530abcd302b59a09fb2c61e8914aebe
Author: Michel Dänzer <michel@tungstengraphics.com>
Date:   Fri Aug 24 13:04:48 2007 +0200

    __glXDRIbindTexImage: Fail if no texture bound to pixmap's texture target.
    
    We would most likely crash somewhere in Mesa if we tried to continue in this
    case.

diff --git a/GL/glx/glxdri.c b/GL/glx/glxdri.c
index 09abca3..4f80155 100644
--- a/GL/glx/glxdri.c
+++ b/GL/glx/glxdri.c
@@ -374,17 +374,25 @@ __glXDRIbindTexImage(__GLXcontext *baseContext,
 {
     RegionPtr	pRegion = NULL;
     PixmapPtr	pixmap;
-    int		bpp, override = 0;
+    int		bpp, override = 0, texname;
     GLenum	format, type;
     ScreenPtr pScreen = glxPixmap->pScreen;
     __GLXDRIscreen * const screen =
 	(__GLXDRIscreen *) __glXgetActiveScreen(pScreen->myNum);
 
+    CALL_GetIntegerv(GET_DISPATCH(), (glxPixmap->target == GL_TEXTURE_2D ?
+				      GL_TEXTURE_BINDING_2D :
+				      GL_TEXTURE_BINDING_RECTANGLE_NV,
+				      &texname));
+
+    if (!texname)
+	return __glXError(GLXBadContextState);
+
     pixmap = (PixmapPtr) glxPixmap->pDraw;
 
     if (screen->texOffsetStart && screen->driScreen.setTexOffset) {
 	__GLXpixmap **texOffsetOverride = screen->texOffsetOverride;
-	int i, firstEmpty = 16, texname;
+	int i, firstEmpty = 16;
 
 	for (i = 0; i < 16; i++) {
 	    if (texOffsetOverride[i] == glxPixmap)
@@ -409,11 +417,6 @@ alreadyin:
 
 	glxPixmap->pDRICtx = &((__GLXDRIcontext*)baseContext)->driContext;
 
-	CALL_GetIntegerv(GET_DISPATCH(), (glxPixmap->target == GL_TEXTURE_2D ?
-					  GL_TEXTURE_BINDING_2D :
-					  GL_TEXTURE_BINDING_RECTANGLE_NV,
-					  &texname));
-
 	if (texname == glxPixmap->texname)
 	    return Success;
 

commit b7cede6e5b1c14bb4a1fc445125994b3e06f0e47
Author: Julien Cristau <jcristau@debian.org>
Date:   Tue Apr 1 16:38:50 2008 +0200

    Update changelog, add closers.

diff --git a/debian/changelog b/debian/changelog
index 608528c..ecdcc51 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,7 +1,10 @@
 xorg-server (2:1.4.1~git20080131-3) UNRELEASED; urgency=low
 
   * XKB: Fix processInputProc wrapping (cherry-picked from upstream).
-    Thanks to Thomas Jaeger.
+    Thanks to Thomas Jaeger.  This should fix the bug with some keys getting
+    stuck (closes: #473165).
+  * xkb: when copying the keymap, make sure the structs default to 0/NULL
+    (cherry-picked from upstream).  Fixes a crash and closes: #461783.
 
   Following patches by Bart Trojanowski, stolen from the ubuntu package:
   * 15_X86EMU-added-blacklist-for-I-O-port-in-0-0xFF-range.patch

commit 98037d1922f7a637d1a68503280d5bcfab3e050d
Author: Peter Hutterer <peter@cs.unisa.edu.au>
Date:   Thu Feb 7 15:48:04 2008 +1030

    xkb: when copying the keymap, make sure the structs default to 0/NULL.
    
    It actually does help if a pointer is NULL rather than pointing to nirvana
    when you're trying to free it lateron. Who would have thought?

diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index e90df0d..ce4df4c 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -1707,9 +1707,8 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
         else {
             if (dst->geom->sz_shapes) {
                 xfree(dst->geom->shapes);
-                dst->geom->shapes = NULL;
             }
-            
+            dst->geom->shapes = NULL;
             dst->geom->num_shapes = 0;
             dst->geom->sz_shapes = 0;
         }
@@ -1758,6 +1757,7 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
             }
 
             dst->geom->num_sections = 0;
+            dst->geom->sections = NULL;
         }
 
         if (src->geom->num_sections) {
@@ -1769,6 +1769,7 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
                 tmp = xalloc(src->geom->num_sections * sizeof(XkbSectionRec));
             if (!tmp)
                 return FALSE;
+            memset(tmp, 0, src->geom->num_sections * sizeof(XkbSectionRec));
             dst->geom->sections = tmp;
             dst->geom->num_sections = src->geom->num_sections;
 
@@ -1804,6 +1805,10 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
                         return FALSE;
                     dsection->doodads = tmp;
                 }
+                else {
+                    dsection->doodads = NULL;
+                }
+
                 for (k = 0,
                       sdoodad = ssection->doodads,
                       ddoodad = dsection->doodads;
@@ -1831,9 +1836,9 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
         else {
             if (dst->geom->sz_sections) {
                 xfree(dst->geom->sections);
-                dst->geom->sections = NULL;
             }
 
+            dst->geom->sections = NULL;
             dst->geom->num_sections = 0;
             dst->geom->sz_sections = 0;
         }
@@ -1862,6 +1867,8 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
                     }
                 }
             }
+            dst->geom->num_doodads = 0;
+            dst->geom->doodads = NULL;
         }
 
         if (src->geom->num_doodads) {
@@ -1874,7 +1881,7 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
                               sizeof(XkbDoodadRec));
             if (!tmp)
                 return FALSE;
-            bzero(tmp, src->geom->num_doodads * sizeof(XkbDoodadRec));
+            memset(tmp, 0, src->geom->num_doodads * sizeof(XkbDoodadRec));
             dst->geom->doodads = tmp;
 
             dst->geom->sz_doodads = src->geom->num_doodads;
@@ -1903,9 +1910,9 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
         else {
             if (dst->geom->sz_doodads) {
                 xfree(dst->geom->doodads);
-                dst->geom->doodads = NULL;
             }
 
+            dst->geom->doodads = NULL;
             dst->geom->num_doodads = 0;
             dst->geom->sz_doodads = 0;
         }
@@ -1933,10 +1940,10 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
             dst->geom->num_key_aliases = dst->geom->sz_key_aliases;
         }
         else {
-            if (dst->geom->sz_key_aliases && dst->geom->key_aliases) {
+            if (dst->geom->key_aliases) {
                 xfree(dst->geom->key_aliases);
-                dst->geom->key_aliases = NULL;
             }
+            dst->geom->key_aliases = NULL;
             dst->geom->num_key_aliases = 0;
             dst->geom->sz_key_aliases = 0;
         }
@@ -1967,8 +1974,8 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
         else {
             if (dst->geom->label_font) {
                 xfree(dst->geom->label_font);
-                dst->geom->label_font = NULL;
             }
+            dst->geom->label_font = NULL;
             dst->geom->label_color = NULL;
             dst->geom->base_color = NULL;
         }

commit 7d9fc60aec35b694918b2baac1bdb56933bfb298
Author: Julien Cristau <jcristau@debian.org>
Date:   Tue Apr 1 16:25:07 2008 +0200

    Add 17_x86emu_handle_cpuid.patch to fix X86EMU CPUID handling.
    
    Closes: #451089

diff --git a/debian/changelog b/debian/changelog
index 34ca6bf..608528c 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -8,6 +8,8 @@ xorg-server (2:1.4.1~git20080131-3) UNRELEASED; urgency=low
     - Restrict access to I/O ports in range 0-0xFF from x86emu.
   * 16_X86EMU-pass-the-correct-bus-dev-fn-tag-to-pci-emula.patch
     - Fix improper emulation of PCI access General Software BIOS.
+  * Add 151_x86emu_handle_cpuid.patch to fix X86EMU CPUID handling.
+    (closes: #451089).
 
  -- Julien Cristau <jcristau@debian.org>  Tue, 01 Apr 2008 15:56:23 +0200
 
diff --git a/debian/patches/17_x86emu_handle_cpuid.patch b/debian/patches/17_x86emu_handle_cpuid.patch
new file mode 100644
index 0000000..1a69fb6
--- /dev/null
+++ b/debian/patches/17_x86emu_handle_cpuid.patch
@@ -0,0 +1,230 @@
+From e76dd7d7991b32cfc0f64bddcdcee201f34a85c5 Mon Sep 17 00:00:00 2001
+From: Bart Trojanowski <bart@symbio-technologies.com>
+Date: Sat, 2 Feb 2008 12:21:57 -0500
+Subject: [PATCH] X86EMU: handle CPUID instruction
+
+This bug is tracked here:
+https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-video-amd/+bug/180742
+
+After trying to switch from X to VT (or just quit) the video-amd driver
+attempts to issue INT 10/0 to go to mode 3 (VGA).  The emulator, running
+the BIOS code, would then spit out:
+
+        c000:0282: A2 ILLEGAL EXTENDED X86 OPCODE!
+
+The opcode was 0F A2, or CPUID; it was not implemented in the emulator.
+This simple patch, against 1.3.0.0, handles the CPUID instruction in one of
+two ways:
+ 1) if ran on __i386__ or __x86_64__ then it calls the CPUID instruction
+     directly.
+ 2) if ran elsewhere it returns a canned 486dx4 set of values for
+     function 1.
+
+This fix allows the video-amd driver to switch back to console mode,
+with the GSW BIOS.
+
+Thanks to Symbio Technologies for funding my work, and ThinCan for
+providing hardware :)
+
+Signed-off-by: Bart Trojanowski <bart@jukie.net>
+---
+ hw/xfree86/x86emu/ops2.c                |   16 ++++++-
+ hw/xfree86/x86emu/prim_ops.c            |   44 +++++++++++++++++
+ hw/xfree86/x86emu/x86emu/prim_ops.h     |    1 +
+ hw/xfree86/x86emu/x86emu/prim_x86_gcc.h |   79 +++++++++++++++++++++++++++++++
+ 4 files changed, 139 insertions(+), 1 deletions(-)
+ create mode 100644 hw/xfree86/x86emu/x86emu/prim_x86_gcc.h
+
+diff --git a/hw/xfree86/x86emu/ops2.c b/hw/xfree86/x86emu/ops2.c
+index 8c6c535..324de8a 100644
+--- a/hw/xfree86/x86emu/ops2.c
++++ b/hw/xfree86/x86emu/ops2.c
+@@ -328,6 +328,20 @@ static void x86emuOp2_pop_FS(u8 X86EMU_UNUSED(op2))
+ }
+ 
+ /****************************************************************************
++REMARKS: CPUID takes EAX/ECX as inputs, writes EAX/EBX/ECX/EDX as output
++Handles opcode 0x0f,0xa2
++****************************************************************************/
++static void x86emuOp2_cpuid(u8 X86EMU_UNUSED(op2))
++{
++    START_OF_INSTR();
++    DECODE_PRINTF("CPUID\n");
++    TRACE_AND_STEP();
++    cpuid();
++    DECODE_CLEAR_SEGOVR();
++    END_OF_INSTR();
++}
++
++/****************************************************************************
+ REMARKS:
+ Handles opcode 0x0f,0xa3
+ ****************************************************************************/
+@@ -2734,7 +2748,7 @@ void (*x86emu_optab2[256])(u8) =
+ 
+ /*  0xa0 */ x86emuOp2_push_FS,
+ /*  0xa1 */ x86emuOp2_pop_FS,
+-/*  0xa2 */ x86emuOp2_illegal_op,
++/*  0xa2 */ x86emuOp2_cpuid,
+ /*  0xa3 */ x86emuOp2_bt_R,
+ /*  0xa4 */ x86emuOp2_shld_IMM,
+ /*  0xa5 */ x86emuOp2_shld_CL,
+diff --git a/hw/xfree86/x86emu/prim_ops.c b/hw/xfree86/x86emu/prim_ops.c
+index 461e09e..07ccfe5 100644
+--- a/hw/xfree86/x86emu/prim_ops.c
++++ b/hw/xfree86/x86emu/prim_ops.c
+@@ -102,6 +102,12 @@
+ #define	PRIM_OPS_NO_REDEFINE_ASM
+ #include "x86emu/x86emui.h"
+ 
++#if defined(__GNUC__)
++# if defined (__i386__) || defined(__i386) || defined(__AMD64__) || defined(__x86_64__) || defined(__amd64__)
++#  include "x86emu/prim_x86_gcc.h"
++# endif
++#endif
++
+ /*------------------------- Global Variables ------------------------------*/
+ 
+ static u32 x86emu_parity_tab[8] =
+@@ -2654,3 +2660,41 @@ DB(	if (CHECK_SP_ACCESS())
+     return res;
+ }
+ 
++/****************************************************************************
++REMARKS:
++CPUID takes EAX/ECX as inputs, writes EAX/EBX/ECX/EDX as output
++****************************************************************************/
++void cpuid (void)
++{
++    u32 feature = M.x86.R_EAX;
++#ifdef X86EMU_HAS_HW_CPUID
++        hw_cpuid(&M.x86.R_EAX, &M.x86.R_EBX, &M.x86.R_ECX, &M.x86.R_EDX);
++#endif
++    switch (feature) {
++    case 0:
++        M.x86.R_EAX = 1;		// maximum function number we support
++#ifndef X86EMU_HAS_PRIM_CPUID
++        M.x86.R_EBX = 0x756e6547;
++        M.x86.R_ECX = 0x6c65746e;
++        M.x86.R_EDX = 0x49656e69;
++#endif
++        break;
++    case 1:
++#ifndef X86EMU_HAS_PRIM_CPUID
++        M.x86.R_EAX = 0x00000480;	// 486dx4
++        M.x86.R_EBX = 0x00000000;
++        M.x86.R_ECX = 0x00000000;
++        M.x86.R_EDX = 0x00000002;	// VME
++#else
++        M.x86.R_EDX &= 0x00000012;	// TSC and VME
++#endif
++        break;
++    default:
++        M.x86.R_EAX = 0;		// don't support extended features
++        M.x86.R_EBX = 0;
++        M.x86.R_ECX = 0;
++        M.x86.R_EDX = 0;
++        break;
++    }
++}
++
+diff --git a/hw/xfree86/x86emu/x86emu/prim_ops.h b/hw/xfree86/x86emu/x86emu/prim_ops.h
+index bea8357..6ac2a29 100644
+--- a/hw/xfree86/x86emu/x86emu/prim_ops.h
++++ b/hw/xfree86/x86emu/x86emu/prim_ops.h
+@@ -133,6 +133,7 @@ void    push_word (u16 w);
+ void    push_long (u32 w);
+ u16     pop_word (void);
+ u32		pop_long (void);
++void    cpuid (void);
+ 
+ #ifdef  __cplusplus
+ }                       			/* End of "C" linkage for C++   	*/
+diff --git a/hw/xfree86/x86emu/x86emu/prim_x86_gcc.h b/hw/xfree86/x86emu/x86emu/prim_x86_gcc.h
+new file mode 100644
+index 0000000..c085ddc
+--- /dev/null
++++ b/hw/xfree86/x86emu/x86emu/prim_x86_gcc.h
+@@ -0,0 +1,79 @@
++/****************************************************************************
++*
++* Inline helpers for x86emu
++*
++* Copyright (C) 2008 Bart Trojanowski, Symbio Technologies, LLC
++*
++*  ========================================================================
++*
++*  Permission to use, copy, modify, distribute, and sell this software and
++*  its documentation for any purpose is hereby granted without fee,
++*  provided that the above copyright notice appear in all copies and that
++*  both that copyright notice and this permission notice appear in
++*  supporting documentation, and that the name of the authors not be used
++*  in advertising or publicity pertaining to distribution of the software
++*  without specific, written prior permission.  The authors makes no
++*  representations about the suitability of this software for any purpose.
++*  It is provided "as is" without express or implied warranty.
++*
++*  THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++*  INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++*  EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
++*  CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
++*  USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
++*  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
++*  PERFORMANCE OF THIS SOFTWARE.
++*
++*  ========================================================================
++*
++* Language:     GNU C
++* Environment:  GCC on i386 or x86-64
++* Developer:    Bart Trojanowski
++*
++* Description:  This file defines a few x86 macros that can be used by the
++*               emulator to execute native instructions.
++*
++*               For PIC vs non-PIC code refer to:
++*               http://sam.zoy.org/blog/2007-04-13-shlib-with-non-pic-code-have-inline-assembly-and-pic-mix-well
++*
++****************************************************************************/
++#ifndef __X86EMU_PRIM_X86_GCC_H
++#define __X86EMU_PRIM_X86_GCC_H
++
++#include "x86emu/types.h"
++
++#if !defined(__GNUC__) || !(defined (__i386__) || defined(__i386) || defined(__AMD64__) || defined(__x86_64__) || defined(__amd64__))
++#error This file is intended to be used by gcc on i386 or x86-64 system
++#endif
++
++#if defined(__PIC__) && defined(__i386__)
++
++#define X86EMU_HAS_HW_CPUID 1
++static inline void hw_cpuid (u32 *a, u32 *b, u32 *c, u32 *d)
++{
++    __asm__ __volatile__ ("pushl %%ebx      \n\t"
++                          "cpuid            \n\t"
++                          "movl %%ebx, %1   \n\t"
++                          "popl %%ebx       \n\t"
++                          : "=a" (*a), "=r" (*b),
++                            "=c" (*c), "=d" (*d)
++                          : "a" (*a), "c" (*c)
++                          : "cc");
++}
++
++#else // ! (__PIC__ && __i386__)
++
++#define X86EMU_HAS_HW_CPUID 1
++static inline void hw_cpuid (u32 *a, u32 *b, u32 *c, u32 *d)
++{
++    __asm__ __volatile__ ("cpuid"
++                          : "=a" (*a), "=b" (*b),
++                            "=c" (*c), "=d" (*d)
++                          : "a" (*a), "c" (*c)
++                          : "cc");
++}
++
++#endif // __PIC__ && __i386__
++
++
++#endif // __X86EMU_PRIM_X86_GCC_H
+-- 
+1.5.3.7.1150.g149d432
+
diff --git a/debian/patches/series b/debian/patches/series
index 83cc18a..845fa9f 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -12,6 +12,7 @@
 14_default_screen_section.diff
 15_X86EMU-added-blacklist-for-I-O-port-in-0-0xFF-range.patch
 16_X86EMU-pass-the-correct-bus-dev-fn-tag-to-pci-emula.patch
+17_x86emu_handle_cpuid.patch
 21_glx_align_fixes.patch
 40_default_dpi_96.patch
 41_vbe_filter_less.diff

commit d469b5a9c437ff0937d5079ca1f7bd8fcf9b42aa
Author: Julien Cristau <jcristau@debian.org>
Date:   Tue Apr 1 16:01:18 2008 +0200

    Add patches to fix broken -amd support.
    
      * 15_X86EMU-added-blacklist-for-I-O-port-in-0-0xFF-range.patch
        - Restrict access to I/O ports in range 0-0xFF from x86emu.
      * 16_X86EMU-pass-the-correct-bus-dev-fn-tag-to-pci-emula.patch
        - Fix improper emulation of PCI access General Software BIOS.
    
    https://launchpad.net/bugs/140051

diff --git a/debian/changelog b/debian/changelog
index 14f1370..34ca6bf 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -3,6 +3,12 @@ xorg-server (2:1.4.1~git20080131-3) UNRELEASED; urgency=low
   * XKB: Fix processInputProc wrapping (cherry-picked from upstream).
     Thanks to Thomas Jaeger.
 
+  Following patches by Bart Trojanowski, stolen from the ubuntu package:
+  * 15_X86EMU-added-blacklist-for-I-O-port-in-0-0xFF-range.patch
+    - Restrict access to I/O ports in range 0-0xFF from x86emu.
+  * 16_X86EMU-pass-the-correct-bus-dev-fn-tag-to-pci-emula.patch
+    - Fix improper emulation of PCI access General Software BIOS.
+
  -- Julien Cristau <jcristau@debian.org>  Tue, 01 Apr 2008 15:56:23 +0200
 
 xorg-server (2:1.4.1~git20080131-2) unstable; urgency=low
diff --git a/debian/patches/15_X86EMU-added-blacklist-for-I-O-port-in-0-0xFF-range.patch b/debian/patches/15_X86EMU-added-blacklist-for-I-O-port-in-0-0xFF-range.patch
new file mode 100644
index 0000000..e883d92
--- /dev/null
+++ b/debian/patches/15_X86EMU-added-blacklist-for-I-O-port-in-0-0xFF-range.patch
@@ -0,0 +1,190 @@
+From 6061612987ebba7ca65835e658b8d969be13a22d Mon Sep 17 00:00:00 2001
+From: Bart Trojanowski <bart@symbio-technologies.com>
+Date: Fri, 11 Jan 2008 11:52:59 -0500
+Subject: [PATCH] X86EMU: added blacklist for I/O port in 0-0xFF range
+
+Signed-off-by: Bart Trojanowski <bart@jukie.net>
+
+Work funded by: Symbio Technologies
+
+There seems to be an inconsistency between what the x86emu gets from the
+PCI handling code and by accessing hardware directly.  x86emu relies on
+a set of functions to emulate PCI access.  When things goes wrong, the
+emulator is asked to execute an OUT instruction on port 0x20.
+
+I've put together a patch against xserver-xorg package that prevents
+accesses to BAD registers.  This turns a freeze into a segfault in X.
+
+http://www.jukie.net/~bart/patches/xorg-server/20080111/0001-X86EMU-
+added-blacklist-for-I-O-port-in-0-0xFF-range.patch
+
+It does not address the DDC not working, I hope that after fixing the
+bugs in x86emu, things may improve.
+
+Anyway, I am continuing to investigate the real cause of the PCI access
+issue.  To find out more read this thread:
+
+http://lists.freedesktop.org/archives/xorg/2008-January/031811.html
+
+-Bart
+
+
+diff -Nurp xorg-server-1.4.1~git20080118/hw/xfree86/int10/helper_exec.c xorg-server-1.4.1~git20080118-working/hw/xfree86/int10/helper_exec.c
+--- xorg-server-1.4.1~git20080118/hw/xfree86/int10/helper_exec.c	2008-01-18 13:23:40.000000000 -0800
++++ xorg-server-1.4.1~git20080118-working/hw/xfree86/int10/helper_exec.c	2008-01-22 09:53:27.000000000 -0800
+@@ -21,6 +21,8 @@
+ #define PRINT_PORT 0
+ 
+ #include <unistd.h>
++#include <sys/types.h>
++#include <signal.h>
+ 
+ #include <X11/Xos.h>
+ #include "xf86.h"
+@@ -210,6 +212,72 @@ stack_trace(xf86Int10InfoPtr pInt)
+ 	xf86ErrorFVerb(3, "\n");
+ }
+ 
++enum port_action_e {
++	PORT_ACTION_PERMIT,
++	PORT_ACTION_WARN,
++	PORT_ACTION_BAIL,
++	PORT_ACTION_MAX
++};
++
++static const struct port_range {
++	CARD16 start, end;
++	enum port_action_e access;
++} port_range_table[] = {
++	// NOTE: port ranges are non overlapping and sorted
++	{ 0x00, 0x1f, PORT_ACTION_BAIL },	// DMA
++	{ 0x20, 0x21, PORT_ACTION_BAIL },	// PIC
++	{ 0x40, 0x47, PORT_ACTION_BAIL },	// PIT 1&2
++	{ 0x50, 0x53, PORT_ACTION_BAIL },
++	{ 0x70, 0x77, PORT_ACTION_BAIL },	// CMOS/RTC
++	{ 0x81, 0x8f, PORT_ACTION_BAIL },	// DIAG REGS
++	{ 0xa0, 0xa1, PORT_ACTION_BAIL },	// PIC2
++	{ 0xc0, 0xdf, PORT_ACTION_BAIL },	// DMA
++};
++#define ARRAY_SIZE(X) (sizeof((X)) / (sizeof(*(X))))
++#define ARRAY_END(X)  (&((X)[ARRAY_SIZE(X)]))
++
++static void assert_port_access_allowed (CARD16 port, CARD16 width)
++{
++	CARD16 access_start, access_end;
++	const struct port_range *pr, *pr_start, *pr_end;
++
++	access_start = port;
++	access_end = port + width - 1;
++
++	// TODO: if the list gets too long we should do a binary search
++	//        or convert the port list to a bitmap representation
++	pr_start = port_range_table;
++	pr_end   = ARRAY_END(port_range_table);
++
++	for (pr = pr_start; pr < pr_end; pr++) {
++		if (access_end < pr->start)
++			continue;
++		if (access_start > pr->end)
++			break;
++
++		// we are in the pr range now
++		switch (pr->access) {
++		default:
++			continue;
++		case PORT_ACTION_BAIL:
++		case PORT_ACTION_WARN:
++			break;
++		}
++
++		ErrorF("Emulator asked to make a suspect %saccess to "
++				"port %u (0x%04x)%s\n",
++				(width == 1) ? "byte " :
++				(width == 2) ? "word " :
++				(width == 4) ? "long " : "",
++				port, port,
++				(pr->access == PORT_ACTION_BAIL)
++				? "; terminating." : "ignoring.");
++
++		if (pr->access == PORT_ACTION_BAIL)
++			kill(getpid(), SIGSEGV);
++	}
++}
++
+ int
+ port_rep_inb(xf86Int10InfoPtr pInt,
+ 	     CARD16 port, CARD32 base, int d_f, CARD32 count)
+@@ -319,7 +387,7 @@ x_inb(CARD16 port)
+ 	    ErrorF(" inb(%#x) = %2.2x\n", port, val);
+ #ifdef __NOT_YET__
+     } else if (port < 0x0100) {		/* Don't interfere with mainboard */
+-	val = 0;
++        val = 0;
+ 	xf86DrvMsgVerb(Int10Current->scrnIndex, X_NOT_IMPLEMENTED, 2,
+ 	    "inb 0x%4.4x\n", port);
+ 	if (xf86GetVerbosity() > 3) {
+@@ -327,10 +395,14 @@ x_inb(CARD16 port)
+ 	    stack_trace(Int10Current);
+ 	}
+ #endif /* __NOT_YET__ */
+-    } else if (!pciCfg1inb(port, &val)) {
+-	val = inb(Int10Current->ioBase + port);
+-	if (PRINT_PORT && DEBUG_IO_TRACE())
+-	    ErrorF(" inb(%#x) = %2.2x\n", port, val);
++    } else {
++	assert_port_access_allowed (port, sizeof(val));
++
++        if (!pciCfg1inb(port, &val)) {
++            val = inb(Int10Current->ioBase + port);
++            if (PRINT_PORT && DEBUG_IO_TRACE())
++                ErrorF(" inb(%#x) = %2.2x\n", port, val);
++        }
+     }
+     return val;
+ }
+@@ -349,10 +421,14 @@ x_inw(CARD16 port)
+ 	 */
+ 	X_GETTIMEOFDAY(&tv);
+ 	val = (CARD16)(tv.tv_usec / 3);
+-    } else if (!pciCfg1inw(port, &val)) {
+-	val = inw(Int10Current->ioBase + port);
+-	if (PRINT_PORT && DEBUG_IO_TRACE())
+-	    ErrorF(" inw(%#x) = %4.4x\n", port, val);
++    } else {
++	assert_port_access_allowed (port, sizeof(val));
++
++        if (!pciCfg1inw(port, &val)) {
++            val = inw(Int10Current->ioBase + port);
++            if (PRINT_PORT && DEBUG_IO_TRACE())
++                ErrorF(" inw(%#x) = %4.4x\n", port, val);
++        }
+     }
+     return val;
+ }
+@@ -384,6 +460,8 @@ x_outb(CARD16 port, CARD8 val)
+     } else if (!pciCfg1outb(port, val)) {
+ 	if (PRINT_PORT && DEBUG_IO_TRACE())
+ 	    ErrorF(" outb(%#x, %2.2x)\n", port, val);
++
++	assert_port_access_allowed (port, sizeof(val));
+ 	outb(Int10Current->ioBase + port, val);
+     }
+ }
+@@ -404,6 +482,8 @@ x_inl(CARD16 port)
+ {
+     CARD32 val;
+ 
++    assert_port_access_allowed (port, sizeof(val));
++
+     if (!pciCfg1in(port, &val)) {
+ 	val = inl(Int10Current->ioBase + port);
+ 	if (PRINT_PORT && DEBUG_IO_TRACE())
+@@ -418,6 +498,8 @@ x_outl(CARD16 port, CARD32 val)
+     if (!pciCfg1out(port, val)) {
+ 	if (PRINT_PORT && DEBUG_IO_TRACE())
+ 	    ErrorF(" outl(%#x, %8.8x)\n", port, val);
++
++	assert_port_access_allowed (port, sizeof(val));
+ 	outl(Int10Current->ioBase + port, val);
+     }
+ }
diff --git a/debian/patches/16_X86EMU-pass-the-correct-bus-dev-fn-tag-to-pci-emula.patch b/debian/patches/16_X86EMU-pass-the-correct-bus-dev-fn-tag-to-pci-emula.patch
new file mode 100644
index 0000000..cfc7116
--- /dev/null
+++ b/debian/patches/16_X86EMU-pass-the-correct-bus-dev-fn-tag-to-pci-emula.patch
@@ -0,0 +1,96 @@
+From 9c17439807c80876bf7027b17859714b31401ab9 Mon Sep 17 00:00:00 2001
+From: Bart Trojanowski <bart@jukie.net>
+Date: Fri, 11 Jan 2008 19:59:54 -0500
+Subject: [PATCH] X86EMU: pass the correct bus:dev:fn tag to pci emulation
+
+Signed-off-by: Bart Trojanowski <bart@jukie.net>
+
+Work funded by: Symbio Technologies
+
+There seems to be an inconsistency between what the x86emu gets from the
+PCI handling code and by accessing hardware directly.  x86emu relies on
+a set of functions to emulate PCI access.  When things goes wrong, the
+emulator is asked to execute an OUT instruction on port 0x20.
+
+I've put together a patch against xserver-xorg package that prevents
+accesses to BAD registers.  This turns a freeze into a segfault in X.
+
+http://www.jukie.net/~bart/patches/xorg-server/20080111/0001-X86EMU-added-blacklist-for-I-O-port-in-0-0xFF-range.patch
+
+It does not address the DDC not working, I hope that after fixing the
+bugs in x86emu, things may improve.
+
+Anyway, I am continuing to investigate the real cause of the PCI access
+issue.  To find out more read this thread:
+
+http://lists.freedesktop.org/archives/xorg/2008-January/031811.html
+
+-Bart
+
+diff -Nurp xorg-server-1.4.1~git20080118-patched/hw/xfree86/int10/helper_exec.c xorg-server-1.4.1~git20080118-working/hw/xfree86/int10/helper_exec.c
+--- xorg-server-1.4.1~git20080118-patched/hw/xfree86/int10/helper_exec.c	2008-01-22 10:22:26.000000000 -0800
++++ xorg-server-1.4.1~git20080118-working/hw/xfree86/int10/helper_exec.c	2008-01-22 11:00:52.000000000 -0800
+@@ -542,7 +542,8 @@ Mem_wl(CARD32 addr, CARD32 val)
+ 
+ static CARD32 PciCfg1Addr = 0;
+ 
+-#define OFFSET(Cfg1Addr) (Cfg1Addr & 0xff)
++#define PCI_OFFSET(x) ((x) & 0x000000ff)
++#define PCI_TAG(x)    ((x) & 0x00ffff00)
+ 
+ static int
+ pciCfg1in(CARD16 addr, CARD32 *val)
+@@ -552,7 +553,7 @@ pciCfg1in(CARD16 addr, CARD32 *val)
+ 	return 1;
+     }
+     if (addr == 0xCFC) {
+-	*val = pciReadLong(Int10Current->Tag, OFFSET(PciCfg1Addr));
++	*val = pciReadLong(PCI_TAG(PciCfg1Addr), PCI_OFFSET(PciCfg1Addr));
+ 	if (PRINT_PORT && DEBUG_IO_TRACE())
+ 	    ErrorF(" cfg_inl(%#x) = %8.8x\n", PciCfg1Addr, *val);
+ 	return 1;
+@@ -570,7 +571,7 @@ pciCfg1out(CARD16 addr, CARD32 val)
+     if (addr == 0xCFC) {
+ 	if (PRINT_PORT && DEBUG_IO_TRACE())
+ 	    ErrorF(" cfg_outl(%#x, %8.8x)\n", PciCfg1Addr, val);
+-	pciWriteLong(Int10Current->Tag, OFFSET(PciCfg1Addr), val);
++	pciWriteLong(PCI_TAG(PciCfg1Addr), PCI_OFFSET(PciCfg1Addr), val);
+ 	return 1;
+     }
+     return 0;
+@@ -588,7 +589,7 @@ pciCfg1inw(CARD16 addr, CARD16 *val)
+     }
+     if ((addr >= 0xCFC) && (addr <= 0xCFF)) {
+ 	offset = addr - 0xCFC;
+-	*val = pciReadWord(Int10Current->Tag, OFFSET(PciCfg1Addr) + offset);
++	*val = pciReadWord(PCI_TAG(PciCfg1Addr), PCI_OFFSET(PciCfg1Addr) + offset);
+ 	if (PRINT_PORT && DEBUG_IO_TRACE())
+ 	    ErrorF(" cfg_inw(%#x) = %4.4x\n", PciCfg1Addr + offset, *val);
+ 	return 1;
+@@ -611,7 +612,7 @@ pciCfg1outw(CARD16 addr, CARD16 val)
+ 	offset = addr - 0xCFC;
+ 	if (PRINT_PORT && DEBUG_IO_TRACE())
+ 	    ErrorF(" cfg_outw(%#x, %4.4x)\n", PciCfg1Addr + offset, val);
+-	pciWriteWord(Int10Current->Tag, OFFSET(PciCfg1Addr) + offset, val);
++	pciWriteWord(PCI_TAG(PciCfg1Addr), PCI_OFFSET(PciCfg1Addr) + offset, val);
+ 	return 1;
+     }
+     return 0;
+@@ -629,7 +630,7 @@ pciCfg1inb(CARD16 addr, CARD8 *val)
+     }
+     if ((addr >= 0xCFC) && (addr <= 0xCFF)) {
+ 	offset = addr - 0xCFC;
+-	*val = pciReadByte(Int10Current->Tag, OFFSET(PciCfg1Addr) + offset);
++	*val = pciReadByte(PCI_TAG(PciCfg1Addr), PCI_OFFSET(PciCfg1Addr) + offset);
+ 	if (PRINT_PORT && DEBUG_IO_TRACE())
+ 	    ErrorF(" cfg_inb(%#x) = %2.2x\n", PciCfg1Addr + offset, *val);
+ 	return 1;
+@@ -652,7 +653,7 @@ pciCfg1outb(CARD16 addr, CARD8 val)
+ 	offset = addr - 0xCFC;
+ 	if (PRINT_PORT && DEBUG_IO_TRACE())
+ 	    ErrorF(" cfg_outb(%#x, %2.2x)\n", PciCfg1Addr + offset, val);
+-	pciWriteByte(Int10Current->Tag, OFFSET(PciCfg1Addr) + offset, val);
++	pciWriteByte(PCI_TAG(PciCfg1Addr), PCI_OFFSET(PciCfg1Addr) + offset, val);
+ 	return 1;
+     }
+     return 0;
diff --git a/debian/patches/series b/debian/patches/series
index d1576ad..83cc18a 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -10,6 +10,8 @@
 11_dont_crash_on_bad_dri_mode.diff
 13_debian_add_xkbpath_env_variable.diff
 14_default_screen_section.diff
+15_X86EMU-added-blacklist-for-I-O-port-in-0-0xFF-range.patch
+16_X86EMU-pass-the-correct-bus-dev-fn-tag-to-pci-emula.patch
 21_glx_align_fixes.patch
 40_default_dpi_96.patch
 41_vbe_filter_less.diff

commit 21c433da5711b32876092541342ee5174de95fdd
Author: Julien Cristau <jcristau@debian.org>
Date:   Tue Apr 1 15:57:45 2008 +0200

    Update changelog

diff --git a/debian/changelog b/debian/changelog
index e3824db..14f1370 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+xorg-server (2:1.4.1~git20080131-3) UNRELEASED; urgency=low
+
+  * XKB: Fix processInputProc wrapping (cherry-picked from upstream).
+    Thanks to Thomas Jaeger.
+
+ -- Julien Cristau <jcristau@debian.org>  Tue, 01 Apr 2008 15:56:23 +0200
+
 xorg-server (2:1.4.1~git20080131-2) unstable; urgency=low
 
   [ Brice Goglin ]

commit eb05b43152d481ba8c3b113243162769e5c20bd0
Author: Thomas Jaeger <thjaeger@gmail.com>
Date:   Tue Apr 1 15:27:06 2008 +0300

    XKB: Fix processInputProc wrapping
    
    If input processing is frozen, only wrap realInputProc: don't smash
    processInputProc as well.  When input processing is thawed, pIP will be
    rewrapped correctly.
    
    This supersedes the previous workaround in 50e80c9.
    
    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
    (cherry picked from commit 37b1258f0a288a79ce6a3eef3559e17a67c4dd96)

diff --git a/include/xkbsrv.h b/include/xkbsrv.h
index 9174eb6..acf3bb0 100644
--- a/include/xkbsrv.h
+++ b/include/xkbsrv.h
@@ -241,6 +241,14 @@ typedef struct	_XkbSrvLedInfo {
 typedef struct
 {
     ProcessInputProc processInputProc;
+    /* If processInputProc is set to something different than realInputProc,
+     * UNWRAP and COND_WRAP will not touch processInputProc and update only
+     * realInputProc.  This ensures that
+     *   processInputProc == (frozen ? EnqueueEvent : realInputProc)
+     *
+     * WRAP_PROCESS_INPUT_PROC should only be called during initialization,
+     * since it may destroy this invariant.
+     */
     ProcessInputProc realInputProc;
     DeviceUnwrapProc unwrapProc;
 } xkbDeviceInfoRec, *xkbDeviceInfoPtr;
@@ -258,14 +266,14 @@ typedef struct
 	    device->public.processInputProc = proc; \
 	oldprocs->processInputProc = \
 	oldprocs->realInputProc = device->public.realInputProc; \
-	if (proc != device->public.enqueueInputProc) \
-		device->public.realInputProc = proc; \
+	device->public.realInputProc = proc; \
 	oldprocs->unwrapProc = device->unwrapProc; \
 	device->unwrapProc = unwrapproc;
 
 #define UNWRAP_PROCESS_INPUT_PROC(device, oldprocs, backupproc) \
-        backupproc = device->public.processInputProc; \
-	device->public.processInputProc = oldprocs->processInputProc; \
+        backupproc = device->public.realInputProc; \
+	if (device->public.processInputProc == device->public.realInputProc)\
+	    device->public.processInputProc = oldprocs->realInputProc; \
 	device->public.realInputProc = oldprocs->realInputProc; \
 	device->unwrapProc = oldprocs->unwrapProc;
 
diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index 6edac29..59d34c5 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -50,15 +50,14 @@ xkbUnwrapProc(DeviceIntPtr device, DeviceHandleProc proc,
                    pointer data)
 {
     xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(device);
-    ProcessInputProc tmp = device->public.processInputProc;
-    ProcessInputProc dummy; /* unused, but neede for macro */
+    ProcessInputProc backupproc;
     if(xkbPrivPtr->unwrapProc)
 	xkbPrivPtr->unwrapProc = NULL;
 
-    UNWRAP_PROCESS_INPUT_PROC(device,xkbPrivPtr, dummy);
+    UNWRAP_PROCESS_INPUT_PROC(device,xkbPrivPtr, backupproc);
     proc(device,data);
-    WRAP_PROCESS_INPUT_PROC(device,xkbPrivPtr,
-			    tmp,xkbUnwrapProc);


Reply to: