GL/glx/glxdri.c | 16 + Xext/xvdisp.c | 52 +- composite/compwindow.c | 8 +- config/10-x11-input.fdi | 12 + config/Makefile.am | 5 +- config/dbus-core.c | 5 +- config/dbus.c | 7 +- config/hal.c | 294 +++++-- configure.ac | 7 +- dix/colormap.c | 1 + dix/devices.c | 1 + dix/pixmap.c | 2 +- dix/window.c | 4 +- fb/fbblt.c | 6 + hw/kdrive/Makefile.am | 16 - hw/xfree86/Makefile.am | 4 +- hw/xfree86/common/Makefile.am | 2 +- hw/xfree86/common/extramodes | 147 +++- hw/xfree86/common/xf86AutoConfig.c | 8 +- hw/xfree86/common/xf86Config.c | 19 +- hw/xfree86/common/xf86Config.h | 2 - hw/xfree86/common/xf86Globals.c | 2 +- hw/xfree86/common/xf86Helper.c | 4 +- hw/xfree86/common/xf86Init.c | 7 +- hw/xfree86/common/xf86Xinput.c | 81 +- hw/xfree86/common/xf86str.h | 1 + hw/xfree86/dixmods/Makefile.am | 10 +- hw/xfree86/dixmods/extmod/xf86misc.c | 33 +- hw/xfree86/doc/man/xorg.conf.man.pre | 24 +- hw/xfree86/int10/helper_exec.c | 95 ++- hw/xfree86/loader/loadmod.c | 3 +- hw/xfree86/modes/xf86Crtc.c | 125 ++- hw/xfree86/modes/xf86Crtc.h | 3 + hw/xfree86/modes/xf86EdidModes.c | 6 +- hw/xfree86/modes/xf86RandR12.c | 11 +- hw/xfree86/modes/xf86Rotate.c | 3 +- hw/xfree86/os-support/linux/lnx_acpi.c | 23 +- hw/xfree86/os-support/linux/lnx_video.c | 11 +- hw/xfree86/parser/Makefile.am | 19 +- hw/xfree86/parser/Module.c | 13 + hw/xfree86/parser/Monitor.c | 2 - hw/xfree86/parser/cpconfig.c | 18 - hw/xfree86/parser/error.c | 20 + hw/xfree86/scanpci/Makefile.am | 4 +- hw/xfree86/utils/Makefile.am | 1 - hw/xfree86/utils/xorgcfg/Makefile.am | 4 +- hw/xfree86/utils/xorgconfig/Makefile.am | 2 +- hw/xfree86/vbe/vbe.c | 4 +- hw/xfree86/x86emu/ops2.c | 16 +- hw/xfree86/x86emu/prim_ops.c | 66 ++ hw/xfree86/x86emu/x86emu/prim_ops.h | 1 + hw/xfree86/x86emu/x86emu/prim_x86_gcc.h | 79 ++ hw/xfree86/xaa/xaaInit.c | 24 + randr/rrcrtc.c | 3 +- render/glyph.c | 2 +- render/miindex.c | 2 + render/picture.c | 4 +- x11-switch | 8 + xkb/xkbUtils.c | 1 + xorg-sdk.rpmmacros | 7 + xorg-server.spec | 934 ++++++++++++++++++++ xserver.pamd | 4 + 65 files changed, 1963 insertions(+), 351 deletions(-) --- a/GL/glx/glxdri.c +++ b/GL/glx/glxdri.c @@ -380,6 +380,22 @@ __glXDRIbindTexImage(__GLXcontext *baseContext, __GLXDRIscreen * const screen = (__GLXDRIscreen *) __glXgetActiveScreen(pScreen->myNum); + if (!screen->texOffsetStart) { + /* When the GLX_EXT_texture_from_pixmap is used, as it's + * implemented here, we want to pull pixmap out of video memory + * and into host memory. */ + extern void XAAEvictPixmaps(void); + static int evictedPixmaps = 0; + + if (!evictedPixmaps) { + __glXDRIenterServer(GL_FALSE); + if (dlsym(RTLD_DEFAULT, "XAAEvictPixmaps")) + XAAEvictPixmaps(); + __glXDRIleaveServer(GL_FALSE); + evictedPixmaps = TRUE; + } + } + pixmap = (PixmapPtr) glxPixmap->pDraw; if (screen->texOffsetStart && screen->driScreen.setTexOffset) { diff --git a/Xext/xvdisp.c b/Xext/xvdisp.c index 21d00aa..5c90492 100644 --- a/Xext/xvdisp.c +++ b/Xext/xvdisp.c @@ -374,6 +374,7 @@ ProcXvQueryAdaptors(ClientPtr client) xvAdaptorInfo ainfo; xvQueryAdaptorsReply rep; int totalSize, na, nf, rc; + int nameSize; XvAdaptorPtr pa; XvFormatPtr pf; WindowPtr pWin; @@ -435,12 +436,12 @@ ProcXvQueryAdaptors(ClientPtr client) ainfo.base_id = pa->base_id; ainfo.num_ports = pa->nPorts; ainfo.type = pa->type; - ainfo.name_size = strlen(pa->name); + ainfo.name_size = nameSize = strlen(pa->name); ainfo.num_formats = pa->nFormats; _WriteAdaptorInfo(client, &ainfo); - WriteToClient(client, ainfo.name_size, pa->name); + WriteToClient(client, nameSize, pa->name); nf = pa->nFormats; pf = pa->pFormats; @@ -466,6 +467,7 @@ ProcXvQueryEncodings(ClientPtr client) xvEncodingInfo einfo; xvQueryEncodingsReply rep; int totalSize; + int nameSize; XvPortPtr pPort; int ne; XvEncodingPtr pe; @@ -510,13 +512,13 @@ ProcXvQueryEncodings(ClientPtr client) while (ne--) { einfo.encoding = pe->id; - einfo.name_size = strlen(pe->name); + einfo.name_size = nameSize = strlen(pe->name); einfo.width = pe->width; einfo.height = pe->height; einfo.rate.numerator = pe->rate.numerator; einfo.rate.denominator = pe->rate.denominator; _WriteEncodingInfo(client, &einfo); - WriteToClient(client, einfo.name_size, pe->name); + WriteToClient(client, nameSize, pe->name); pe++; } @@ -994,18 +996,19 @@ ProcXvQueryPortAttributes(ClientPtr client) rep.text_size = 0; for(i = 0, pAtt = pPort->pAdaptor->pAttributes; - i < rep.num_attributes; i++, pAtt++) + i < pPort->pAdaptor->nAttributes; i++, pAtt++) { rep.text_size += (strlen(pAtt->name) + 1 + 3) & ~3L; } - rep.length = (rep.num_attributes * sz_xvAttributeInfo) + rep.text_size; + rep.length = rep.length = (pPort->pAdaptor->nAttributes * sz_xvAttributeInfo) + + rep.text_size; rep.length >>= 2; _WriteQueryPortAttributesReply(client, &rep); for(i = 0, pAtt = pPort->pAdaptor->pAttributes; - i < rep.num_attributes; i++, pAtt++) + i < pPort->pAdaptor->nAttributes; i++, pAtt++) { size = strlen(pAtt->name) + 1; /* pass the NULL */ Info.flags = pAtt->flags; @@ -1216,6 +1219,7 @@ ProcXvQueryImageAttributes(ClientPtr client) XvPortPtr pPort; int *offsets; int *pitches; + int planeLength; REQUEST(xvQueryImageAttributesReq); REQUEST_SIZE_MATCH(xvQueryImageAttributesReq); @@ -1255,7 +1259,7 @@ ProcXvQueryImageAttributes(ClientPtr client) rep.type = X_Reply; rep.sequenceNumber = client->sequence; - rep.length = num_planes << 1; + rep.length = planeLength = num_planes << 1; rep.num_planes = num_planes; rep.width = width; rep.height = height; @@ -1263,8 +1267,8 @@ ProcXvQueryImageAttributes(ClientPtr client) _WriteQueryImageAttributesReply(client, &rep); if(client->swapped) - SwapLongs((CARD32*)offsets, rep.length); - WriteToClient(client, rep.length << 2, (char*)offsets); + SwapLongs((CARD32*)offsets, planeLength); + WriteToClient(client, planeLength << 2, (char*)offsets); xfree(offsets); @@ -1292,13 +1296,13 @@ ProcXvListImageFormats(ClientPtr client) rep.type = X_Reply; rep.sequenceNumber = client->sequence; rep.num_formats = pPort->pAdaptor->nImages; - rep.length = rep.num_formats * sz_xvImageFormatInfo >> 2; + rep.length = pPort->pAdaptor->nImages * sz_xvImageFormatInfo >> 2; _WriteListImageFormatsReply(client, &rep); pImage = pPort->pAdaptor->pImages; - for(i = 0; i < rep.num_formats; i++, pImage++) { + for(i = 0; i < pPort->pAdaptor->nImages; i++, pImage++) { info.id = pImage->id; info.type = pImage->type; info.byte_order = pImage->byte_order; @@ -1497,6 +1501,7 @@ SProcXvShmPutImage(ClientPtr client) swapl(&stuff->gc, n); swapl(&stuff->shmseg, n); swapl(&stuff->id, n); + swapl(&stuff->offset, n); swaps(&stuff->src_x, n); swaps(&stuff->src_y, n); swaps(&stuff->src_w, n); @@ -1505,7 +1510,6 @@ SProcXvShmPutImage(ClientPtr client) swaps(&stuff->drw_y, n); swaps(&stuff->drw_w, n); swaps(&stuff->drw_h, n); - swaps(&stuff->offset, n); swaps(&stuff->width, n); swaps(&stuff->height, n); return ProcXvShmPutImage(client); @@ -1552,6 +1556,7 @@ SProcXvSetPortAttribute(ClientPtr client) swaps(&stuff->length, n); swapl(&stuff->port, n); swapl(&stuff->attribute, n); + swapl(&stuff->value, n); return ProcXvSetPortAttribute(client); } @@ -1596,9 +1601,10 @@ SProcXvQueryImageAttributes(ClientPtr client) register char n; REQUEST(xvQueryImageAttributesReq); swaps(&stuff->length, n); + swapl(&stuff->port, n); swapl(&stuff->id, n); swaps(&stuff->width, n); - swaps(&stuff->width, n); + swaps(&stuff->height, n); return ProcXvQueryImageAttributes(client); } @@ -1625,7 +1631,7 @@ SWriteQueryExtensionReply( swaps(&rep->version, n); swaps(&rep->revision, n); - (void)WriteToClient(client, sz_xvQueryExtensionReply, (char *)&rep); + (void)WriteToClient(client, sz_xvQueryExtensionReply, (char *)rep); return Success; } @@ -1641,7 +1647,7 @@ SWriteQueryAdaptorsReply( swapl(&rep->length, n); swaps(&rep->num_adaptors, n); - (void)WriteToClient(client, sz_xvQueryAdaptorsReply, (char *)&rep); + (void)WriteToClient(client, sz_xvQueryAdaptorsReply, (char *)rep); return Success; } @@ -1657,7 +1663,7 @@ SWriteQueryEncodingsReply( swapl(&rep->length, n); swaps(&rep->num_encodings, n); - (void)WriteToClient(client, sz_xvQueryEncodingsReply, (char *)&rep); + (void)WriteToClient(client, sz_xvQueryEncodingsReply, (char *)rep); return Success; } @@ -1764,7 +1770,7 @@ SWriteGrabPortReply( swaps(&rep->sequenceNumber, n); swapl(&rep->length, n); - (void)WriteToClient(client, sz_xvGrabPortReply, (char *)&rep); + (void)WriteToClient(client, sz_xvGrabPortReply, (char *)rep); return Success; } @@ -1780,7 +1786,7 @@ SWriteGetPortAttributeReply( swapl(&rep->length, n); swapl(&rep->value, n); - (void)WriteToClient(client, sz_xvGetPortAttributeReply, (char *)&rep); + (void)WriteToClient(client, sz_xvGetPortAttributeReply, (char *)rep); return Success; } @@ -1797,7 +1803,7 @@ SWriteQueryBestSizeReply( swaps(&rep->actual_width, n); swaps(&rep->actual_height, n); - (void)WriteToClient(client, sz_xvQueryBestSizeReply, (char *)&rep); + (void)WriteToClient(client, sz_xvQueryBestSizeReply, (char *)rep); return Success; } @@ -1814,7 +1820,7 @@ SWriteQueryPortAttributesReply( swapl(&rep->num_attributes, n); swapl(&rep->text_size, n); - (void)WriteToClient(client, sz_xvQueryPortAttributesReply, (char *)&rep); + (void)WriteToClient(client, sz_xvQueryPortAttributesReply, (char *)rep); return Success; } @@ -1833,7 +1839,7 @@ SWriteQueryImageAttributesReply( swaps(&rep->width, n); swaps(&rep->height, n); - (void)WriteToClient(client, sz_xvQueryImageAttributesReply, (char *)&rep); + (void)WriteToClient(client, sz_xvQueryImageAttributesReply, (char *)rep); return Success; } @@ -1850,7 +1856,7 @@ SWriteListImageFormatsReply( swapl(&rep->length, n); swapl(&rep->num_formats, n); - (void)WriteToClient(client, sz_xvListImageFormatsReply, (char *)&rep); + (void)WriteToClient(client, sz_xvListImageFormatsReply, (char *)rep); return Success; } diff --git a/composite/compwindow.c b/composite/compwindow.c index 65f77cf..220e95c 100644 --- a/composite/compwindow.c +++ b/composite/compwindow.c @@ -595,12 +595,15 @@ compCopyWindow (WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc) } else { + CompWindowPtr cw = GetCompWindow (pWin); + ptOldOrg.x -= dx; ptOldOrg.y -= dy; REGION_TRANSLATE (prgnSrc, prgnSrc, pWin->drawable.x - ptOldOrg.x, pWin->drawable.y - ptOldOrg.y); - DamageDamageRegion (&pWin->drawable, prgnSrc); + if (pWin->redirectDraw && cw->update == CompositeRedirectAutomatic) + DamageDamageRegion (&pWin->drawable, prgnSrc); } cs->CopyWindow = pScreen->CopyWindow; pScreen->CopyWindow = compCopyWindow; @@ -679,7 +682,8 @@ compSetRedirectBorderClip (WindowPtr pWin, RegionPtr pRegion) /* * Report that as damaged so it will be redrawn */ - DamageDamageRegion (&pWin->drawable, &damage); + if (cw->update == CompositeRedirectAutomatic) + DamageDamageRegion (&pWin->drawable, &damage); REGION_UNINIT (pScreen, &damage); /* * Save the new border clip region diff --git a/config/dbus-core.c b/config/dbus-core.c index 9cf1530..b349c6e 100644 --- a/config/dbus-core.c +++ b/config/dbus-core.c @@ -56,8 +56,9 @@ wakeup_handler(pointer data, int err, pointer read_mask) if (info->connection && FD_ISSET(info->fd, (fd_set *) read_mask)) { do { dbus_connection_read_write_dispatch(info->connection, 0); - } while (dbus_connection_get_dispatch_status(info->connection) == - DBUS_DISPATCH_DATA_REMAINS); + } while (info->connection && + dbus_connection_get_is_connected(info->connection) && + dbus_connection_get_dispatch_status(info->connection) == DBUS_DISPATCH_DATA_REMAINS); } } diff --git a/config/dbus.c b/config/dbus.c index 6fe0618..cef8ed5 100644 --- a/config/dbus.c +++ b/config/dbus.c @@ -213,7 +213,7 @@ remove_device(DBusMessage *message, DBusMessage *reply, DBusError *error) MALFORMED_MESSAGE_ERROR(); } - dev = LookupDeviceIntRec(deviceid); + dixLookupDevice(&dev, deviceid, serverClient, DixDestroyAccess); if (!dev) { DebugF("[config/dbus] bogus device id %d given\n", deviceid); ret = BadMatch; @@ -396,9 +396,6 @@ err_start: static void disconnect_hook(void *data) { - struct connection_info *info = data; - - reset_info(info); } #if 0 @@ -440,4 +437,6 @@ void config_dbus_fini(void) { config_dbus_core_remove_hook(&core_hook); + connection_data.busname[0] = '\0'; + connection_data.busobject[0] = '\0'; } diff --git a/configure.ac b/configure.ac index f75fc61..60bb922 100644 --- a/configure.ac +++ b/configure.ac @@ -2074,7 +2074,6 @@ hw/xfree86/utils/gtf/Makefile hw/xfree86/utils/ioport/Makefile hw/xfree86/utils/kbd_mode/Makefile hw/xfree86/utils/pcitweak/Makefile -hw/xfree86/utils/scanpci/Makefile hw/xfree86/utils/xorgcfg/Makefile hw/xfree86/utils/xorgconfig/Makefile hw/dmx/config/Makefile diff --git a/dix/colormap.c b/dix/colormap.c index 73b6669..8836737 100644 --- a/dix/colormap.c +++ b/dix/colormap.c @@ -1013,6 +1013,7 @@ FakeAllocColor (ColormapPtr pmap, xColorItem *item) switch (class) { case GrayScale: case PseudoColor: + temp = 0; item->pixel = 0; if (FindColor(pmap, pmap->red, entries, &rgb, &temp, PSEUDOMAP, -1, AllComp) == Success) { diff --git a/dix/devices.c b/dix/devices.c index f6f3c8e..8a6b0ba 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -533,6 +533,7 @@ CloseDevice(DeviceIntPtr dev) xfree(dev->key->curKeySyms.map); xfree(dev->key->modifierKeyMap); xfree(dev->key); + dev->key = NULL; } if (dev->valuator) { diff --git a/dix/pixmap.c b/dix/pixmap.c index c280a3b..9c25b8e 100644 --- a/dix/pixmap.c +++ b/dix/pixmap.c @@ -118,7 +118,7 @@ AllocatePixmap(ScreenPtr pScreen, int pixDataSize) if (pScreen->totalPixmapSize > ((size_t)-1) - pixDataSize) return NullPixmap; - pPixmap = (PixmapPtr)xalloc(pScreen->totalPixmapSize + pixDataSize); + pPixmap = (PixmapPtr)xcalloc(1, pScreen->totalPixmapSize + pixDataSize); if (!pPixmap) return NullPixmap; ppriv = (DevUnion *)(pPixmap + 1); diff --git a/dix/window.c b/dix/window.c index 961c02a..0340165 100644 --- a/dix/window.c +++ b/dix/window.c @@ -138,8 +138,8 @@ Equipment Corporation. * ******/ -static unsigned char _back_lsb[4] = {0x88, 0x22, 0x44, 0x11}; -static unsigned char _back_msb[4] = {0x11, 0x44, 0x22, 0x88}; +static unsigned char _back_lsb[4] = {0x00, 0x00, 0x00, 0x00}; +static unsigned char _back_msb[4] = {0x00, 0x00, 0x00, 0x00}; _X_EXPORT int screenIsSaved = SCREEN_SAVER_OFF; diff --git a/fb/fbblt.c b/fb/fbblt.c index 837c3a2..1602edd 100644 --- a/fb/fbblt.c +++ b/fb/fbblt.c @@ -76,6 +76,11 @@ fbBlt (FbBits *srcLine, } #endif +/* + * Disable optimization (introduced by ajax) due to a general vesa + * driver crash later in memcpy +*/ +#if 0 if (alu == GXcopy && pm == FB_ALLONES && !reverse && !(srcX & 7) && !(dstX & 7) && !(width & 7)) { int i; @@ -97,6 +102,7 @@ fbBlt (FbBits *srcLine, return; } +#endif FbInitializeMergeRop(alu, pm); destInvarient = FbDestInvarientMergeRop(); diff --git a/hw/xfree86/Makefile.am b/hw/xfree86/Makefile.am index ca7dda1..1e7443e 100644 --- a/hw/xfree86/Makefile.am +++ b/hw/xfree86/Makefile.am @@ -53,7 +53,7 @@ XORG_LIBS = \ loader/libloader.a \ libosandcommon.la \ rac/librac.a \ - parser/libxf86config.a \ + parser/libxf86config.la \ dixmods/libdixmods.la \ modes/libxf86modes.a \ ramdac/libramdac.a \ diff --git a/hw/xfree86/common/Makefile.am b/hw/xfree86/common/Makefile.am index d15e99a..f5780e7 100644 --- a/hw/xfree86/common/Makefile.am +++ b/hw/xfree86/common/Makefile.am @@ -31,7 +31,7 @@ BUILT_SOURCES = xf86DefModeSet.c AM_LDFLAGS = -r libcommon_la_SOURCES = xf86Configure.c xf86Bus.c xf86Config.c \ xf86Cursor.c xf86cvt.c xf86DGA.c xf86DPMS.c \ - xf86DoProbe.c xf86DoScanPci.c xf86Events.c \ + xf86DoProbe.c xf86Events.c \ xf86Globals.c xf86AutoConfig.c \ xf86MiscExt.c xf86Option.c \ xf86VidMode.c xf86fbman.c xf86cmap.c \ diff --git a/hw/xfree86/common/extramodes b/hw/xfree86/common/extramodes index 1d72861..31e22fc 100644 --- a/hw/xfree86/common/extramodes +++ b/hw/xfree86/common/extramodes @@ -3,21 +3,162 @@ // // $XFree86: xc/programs/Xserver/hw/xfree86/etc/extramodes,v 1.5 2002/06/05 19:43:05 dawes Exp $ // +// NOTE: Please keep all video modes sorted in order of X res, then Y res for +// ease of maintenance and readability. # 832x624 @ 75Hz (74.55Hz) (fix if the official/Apple spec is different) hsync: 49.725kHz ModeLine "832x624" 57.284 832 864 928 1152 624 625 628 667 -Hsync -Vsync +# Disable the 848x480 modes for now. They're quite rare, and they screw up +# the autosizing logic. They're panel modes anyway, and EDID injection +# should cover that now. - ajax, 2006-07-28 + +# 848x480 @ 60.00 Hz (GTF) hsync: 29.82 kHz; pclk: 31.49 MHz +# Modeline "848x480" 31.49 848 864 952 1056 480 481 484 497 -HSync +Vsync + +# 848x480 @ 70.00 Hz (GTF) hsync: 35.00 kHz; pclk: 37.52 MHz +# Modeline "848x480" 37.52 848 872 960 1072 480 481 484 500 -HSync +Vsync + +# 848x480 @ 75.00 Hz (GTF) hsync: 37.65 kHz; pclk: 40.96 MHz +# Modeline "848x480" 40.96 848 880 968 1088 480 481 484 502 -HSync +Vsync + +# 848x480 @ 85.00 Hz (GTF) hsync: 42.92 kHz; pclk: 47.39 MHz +# Modeline "848x480" 47.39 848 888 976 1104 480 481 484 505 -HSync +Vsync + # 1152x768 @ 54.8Hz (Titanium PowerBook) hsync: 44.2kHz ModeLine "1152x768" 64.995 1152 1178 1314 1472 768 771 777 806 +hsync +vsync +# 1152x864 @ 60.00 Hz (GTF) hsync: 53.70 kHz; pclk: 81.62 MHz +Modeline "1152x864" 81.62 1152 1216 1336 1520 864 865 868 895 -HSync +Vsync + +# 1152x864 @ 70.00 Hz (GTF) hsync: 63.00 kHz; pclk: 96.77 MHz +Modeline "1152x864" 96.77 1152 1224 1344 1536 864 865 868 900 -HSync +Vsync + +# 1152x864 @ 75.00 Hz (GTF) hsync: 67.65 kHz; pclk: 104.99 MHz +Modeline "1152x864" 104.99 1152 1224 1352 1552 864 865 868 902 -HSync +Vsync + +# 1152x864 @ 85.00 Hz (GTF) hsync: 77.10 kHz; pclk: 119.65 MHz +Modeline "1152x864" 119.65 1152 1224 1352 1552 864 865 868 907 -HSync +Vsync + +# 1152x864 @ 85Hz (Red Hat custom modeline) +ModeLine "1152x864" 121.5 1152 1216 1344 1568 864 865 868 911 +hsync -vsync + +# 1152x864 @ 100.00 Hz (GTF) hsync: 91.50 kHz; pclk: 143.47 MHz +Modeline "1152x864" 143.47 1152 1232 1360 1568 864 865 868 915 -HSync +Vsync + +# 1280x720 @ 60.00 Hz (GTF) hsync: 44.76 kHz; pclk: 74.48 MHz +Modeline "1280x720" 74.48 1280 1336 1472 1664 720 721 724 746 -HSync +Vsync + +# 1280x720 @ 70.00 Hz (GTF) hsync: 52.50 kHz; pclk: 89.04 MHz +Modeline "1280x720" 89.04 1280 1352 1488 1696 720 721 724 750 -HSync +Vsync + +# 1280x720 @ 75.00 Hz (GTF) hsync: 56.40 kHz; pclk: 95.65 MHz +Modeline "1280x720" 95.65 1280 1352 1488 1696 720 721 724 752 -HSync +Vsync + +# 1280x720 @ 85.00 Hz (GTF) hsync: 64.26 kHz; pclk: 110.01 MHz +Modeline "1280x720" 110.01 1280 1360 1496 1712 720 721 724 756 -HSync +Vsync + +# 1280x800 @ 60.00 Hz (GTF) hsync: 49.68 kHz; pclk: 83.46 MHz +Modeline "1280x800" 83.46 1280 1344 1480 1680 800 801 804 828 -HSync +Vsync + +# 1280x800 @ 70.00 Hz (GTF) hsync: 58.31 kHz; pclk: 98.89 MHz +Modeline "1280x800" 98.89 1280 1352 1488 1696 800 801 804 833 -HSync +Vsync + +# 1280x800 @ 75.00 Hz (GTF) hsync: 62.62 kHz; pclk: 107.21 MHz +Modeline "1280x800" 107.21 1280 1360 1496 1712 800 801 804 835 -HSync +Vsync + +# 1280x800 @ 85.00 Hz (GTF) hsync: 71.40 kHz; pclk: 123.38 MHz +Modeline "1280x800" 123.38 1280 1368 1504 1728 800 801 804 840 -HSync +Vsync + +# 1280x768 @ 60.00 Hz (GTF) hsync: 47.70 kHz; pclk: 80.14 MHz +Modeline "1280x768" 80.14 1280 1344 1480 1680 768 769 772 795 -HSync +Vsync + +# 1280x768 @ 70.00 Hz (GTF) hsync: 56.00 kHz; pclk: 94.98 MHz +Modeline "1280x768" 94.98 1280 1352 1488 1696 768 769 772 800 -HSync +Vsync + +# 1280x768 @ 75.00 Hz (GTF) hsync: 60.15 kHz; pclk: 102.98 MHz +Modeline "1280x768" 102.98 1280 1360 1496 1712 768 769 772 802 -HSync +Vsync + +# 1280x768 @ 85.00 Hz (GTF) hsync: 68.60 kHz; pclk: 118.53 MHz +Modeline "1280x768" 118.53 1280 1368 1504 1728 768 769 772 807 -HSync +Vsync + +# 1360x768 59.96 Hz (CVT) hsync: 47.37 kHz; pclk: 72.00 MHz +#Modeline "1360x768" 72.00 1360 1408 1440 1520 768 771 781 790 +hsync -vsync + +# 1360x768 59.80 Hz (CVT) hsync: 47.72 kHz; pclk: 84.75 MHz +#Modeline "1360x768" 84.75 1360 1432 1568 1776 768 771 781 798 -hsync +vsync + # 1400x1050 @ 60Hz (VESA GTF) hsync: 65.5kHz ModeLine "1400x1050" 122.0 1400 1488 1640 1880 1050 1052 1064 1082 +hsync +vsync +# 1400x1050 @ 70.00 Hz (GTF) hsync: 76.51 kHz; pclk: 145.06 MHz +Modeline "1400x1050" 145.06 1400 1496 1648 1896 1050 1051 1054 1093 -HSync +Vsync + +# 1400x1050 @ 70Hz (Red Hat custom modeline) hsync: 76.8kHz +ModeLine "1400x1050" 151.0 1400 1464 1656 1960 1050 1051 1054 1100 +hsync +vsync + # 1400x1050 @ 75Hz (VESA GTF) hsync: 82.2kHz ModeLine "1400x1050" 155.8 1400 1464 1784 1912 1050 1052 1064 1090 +hsync +vsync -# 1600x1024 @ 60Hz (SGI 1600SW) hsync: 64.0kHz -Modeline "1600x1024" 106.910 1600 1620 1640 1670 1024 1027 1030 1067 -hsync -vsync +# 1400x1050 @ 85.00 Hz (GTF) hsync: 93.76 kHz; pclk: 179.26 MHz +Modeline "1400x1050" 179.26 1400 1504 1656 1912 1050 1051 1054 1103 -HSync +Vsync + +# 1400x1050 @ 85Hz (Red Hat custom modeline) hsync: 93.2 kHz +ModeLine "1400x1050" 184.0 1400 1464 1656 1960 1050 1051 1054 1100 +hsync +vsync + +# 1440x900 @ 60.00 Hz (CVT) field rate 59.89 Hz; hsync: 55.93 kHz; pclk: 106.50 MHz +Modeline "1440x900" 106.50 1440 1520 1672 1904 900 903 909 934 -HSync +Vsync + +# 1600x1024 for SGI 1600 SW +ModeLine "1600x1024" 103.125 1600 1600 1656 1664 1024 1024 1029 1030 +Hsync +Vsync + +# 1680x1050 59.88 Hz (CVT 1.76MA-R) hsync: 64.67 kHz; pclk: 119.00 MHz +Modeline "1680x1050" 119.00 1680 1728 1760 1840 1050 1053 1059 1080 +hsync -vsync + +# 1680x1050 59.95 Hz (CVT 1.76MA) hsync: 65.29 kHz; pclk: 146.25 MHz +Modeline "1680x1050" 146.25 1680 1784 1960 2240 1050 1053 1059 1089 -hsync +vsync + +# 1680x1050 69.88 Hz (CVT) hsync: 76.58 kHz; pclk: 174.00 MHz +Modeline "1680x1050" 174.00 1680 1800 1976 2272 1050 1053 1059 1096 -hsync +vsync + +# 1680x1050 74.89 Hz (CVT 1.76MA) hsync: 82.31 kHz; pclk: 187.00 MHz +Modeline "1680x1050" 187.00 1680 1800 1976 2272 1050 1053 1059 1099 -hsync +vsync + +# 1680x1050 84.94 Hz (CVT 1.76MA) hsync: 93.86 kHz; pclk: 214.75 MHz +Modeline "1680x1050" 214.75 1680 1808 1984 2288 1050 1053 1059 1105 -hsync +vsync + +# 1920x1080 59.93 Hz (CVT 2.07M9-R) hsync: 66.59 kHz; pclk: 138.50 MHz +Modeline "1920x1080" 138.50 1920 1968 2000 2080 1080 1083 1088 1111 +hsync -vsync + +# 1920x1080 59.96 Hz (CVT 2.07M9) hsync: 67.16 kHz; pclk: 173.00 MHz +Modeline "1920x1080" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync + +# 1920x1080 69.92 Hz (CVT) hsync: 78.80 kHz; pclk: 204.25 MHz +Modeline "1920x1080" 204.25 1920 2056 2256 2592 1080 1083 1088 1127 -hsync +vsync + +# 1920x1080 74.91 Hz (CVT 2.07M9) hsync: 84.64 kHz; pclk: 220.75 MHz +Modeline "1920x1080" 220.75 1920 2064 2264 2608 1080 1083 1088 1130 -hsync +vsync + +# 1920x1080 84.88 Hz (CVT 2.07M9) hsync: 96.51 kHz; pclk: 253.25 MHz +Modeline "1920x1080" 253.25 1920 2064 2272 2624 1080 1083 1088 1137 -hsync +vsync + +# 1920x1200 59.95 Hz (CVT 2.30MA-R) hsync: 74.04 kHz; pclk: 154.00 MHz +Modeline "1920x1200" 154.00 1920 1968 2000 2080 1200 1203 1209 1235 +hsync -vsync + +# 1920x1200 @ 60.00 Hz (GTF) hsync: 74.52 kHz; pclk: 193.16 MHz +Modeline "1920x1200" 193.16 1920 2048 2256 2592 1200 1201 1204 1242 -HSync +Vsync + +# 1920x1200 @ 70.00 Hz (GTF) hsync: 87.43 kHz; pclk: 228.02 MHz +Modeline "1920x1200" 228.02 1920 2056 2264 2608 1200 1201 1204 1249 -HSync +Vsync + +# 1920x1200 @ 70Hz (Red Hat custom modeline - bugzilla #53364) hsync: 87.50 KHz +Modeline "1920x1200" 230.0 1920 1936 2096 2528 1200 1201 1204 1250 -HSync -VSync + +# 1920x1200 @ 75.00 Hz (GTF) hsync: 93.97 kHz; pclk: 246.59 MHz +Modeline "1920x1200" 246.59 1920 2064 2272 2624 1200 1201 1204 1253 -HSync +Vsync + +# 1920x1200 @ 85.00 Hz (GTF) hsync: 107.10 kHz; pclk: 282.74 MHz +Modeline "1920x1200" 282.74 1920 2072 2280 2640 1200 1201 1204 1260 -HSync +Vsync # 1920x1440 @ 85Hz (VESA GTF) hsync: 128.5kHz Modeline "1920x1440" 341.35 1920 2072 2288 2656 1440 1441 1444 1512 -hsync +vsync @@ -31,3 +172,5 @@ Modeline "2048x1536" 340.48 2048 2216 2440 2832 1536 1537 1540 1603 -hsync +vs # 2048x1536 @ 85Hz (VESA GTF) hsync: 137.0kHz Modeline "2048x1536" 388.04 2048 2216 2440 2832 1536 1537 1540 1612 -hsync +vsync +# 2560x1600 @ 60.00 Hz (GTF) hsync: 99.36 kHz; pclk: 348.16 MHz +Modeline "2560x1600" 348.16 2560 2752 3032 3504 1600 1601 1604 1656 -HSync +Vsync diff --git a/hw/xfree86/common/xf86AutoConfig.c b/hw/xfree86/common/xf86AutoConfig.c index 703d156..2b5968e 100644 --- a/hw/xfree86/common/xf86AutoConfig.c +++ b/hw/xfree86/common/xf86AutoConfig.c @@ -48,8 +48,7 @@ "\tLoad\t\"dbe\"\n" \ "\tLoad\t\"glx\"\n" \ "\tLoad\t\"freetype\"\n" \ - "\tLoad\t\"type1\"\n" \ - "\tLoad\t\"record\"\n" \ + "\tLoad\t\"freetype\"\n" \ "\tLoad\t\"dri\"\n" \ "EndSection\n\n" @@ -99,9 +97,7 @@ static const char **builtinConfig = NULL; static int builtinLines = 0; static const char *deviceList[] = { - "fbdev", "vesa", - "vga", NULL }; @@ -168,7 +164,7 @@ videoPtrToDriverName(pciVideoPtr info) { case 0x1022: if (info->chipType == 0x2081) - return "amd"; + return "geode"; else return NULL; case 0x1142: return "apm"; @@ -208,7 +204,7 @@ videoPtrToDriverName(pciVideoPtr info) case 0x3d3d: return "glint"; case 0x1023: return "trident"; case 0x100c: return "tseng"; - case 0x1106: return "via"; + case 0x1106: return "openchrome"; case 0x15ad: return "vmware"; default: break; } diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c index 3c29497..01aca5b 100644 --- a/hw/xfree86/common/xf86Config.c +++ b/hw/xfree86/common/xf86Config.c @@ -800,7 +800,7 @@ static OptionInfoRec FlagOptions[] = { { FLAG_MODINDEVALLOWNONLOCAL, "AllowNonLocalModInDev", OPTV_BOOLEAN, {0}, FALSE }, { FLAG_ALLOWMOUSEOPENFAIL, "AllowMouseOpenFail", OPTV_BOOLEAN, - {0}, FALSE }, + {0}, TRUE }, { FLAG_VTINIT, "VTInit", OPTV_STRING, {0}, FALSE }, { FLAG_VTSYSREQ, "VTSysReq", OPTV_BOOLEAN, @@ -834,7 +834,7 @@ static OptionInfoRec FlagOptions[] = { { FLAG_ESTIMATE_SIZES_AGGRESSIVELY,"EstimateSizesAggressively",OPTV_INTEGER, {0}, FALSE }, { FLAG_NOPM, "NoPM", OPTV_BOOLEAN, - {0}, FALSE }, + {0}, TRUE }, { FLAG_XINERAMA, "Xinerama", OPTV_BOOLEAN, {0}, FALSE }, { FLAG_ALLOW_DEACTIVATE_GRABS,"AllowDeactivateGrabs", OPTV_BOOLEAN, @@ -852,13 +852,13 @@ static OptionInfoRec FlagOptions[] = { { FLAG_AIGLX, "AIGLX", OPTV_BOOLEAN, {0}, FALSE }, { FLAG_ALLOW_EMPTY_INPUT, "AllowEmptyInput", OPTV_BOOLEAN, - {0}, FALSE }, + {0}, TRUE }, { FLAG_IGNORE_ABI, "IgnoreABI", OPTV_BOOLEAN, {0}, FALSE }, { FLAG_USE_DEFAULT_FONT_PATH, "UseDefaultFontPath", OPTV_BOOLEAN, {0}, FALSE }, { FLAG_AUTO_ADD_DEVICES, "AutoAddDevices", OPTV_BOOLEAN, - {0}, TRUE }, + {0}, FALSE }, { FLAG_AUTO_ENABLE_DEVICES, "AutoEnableDevices", OPTV_BOOLEAN, {0}, TRUE }, { -1, NULL, OPTV_NONE, @@ -930,7 +930,7 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts) from = X_CONFIG; } else { - xf86Info.autoAddDevices = TRUE; + xf86Info.autoAddDevices = FALSE; from = X_DEFAULT; } xf86Msg(from, "%sutomatically adding devices\n", @@ -967,6 +967,7 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts) xf86Info.miscModInDevAllowNonLocal = value; #endif + xf86Info.allowMouseOpenFail = TRUE; if (xf86GetOptValBool(FlagOptions, FLAG_ALLOWMOUSEOPENFAIL, &value)) xf86Info.allowMouseOpenFail = value; @@ -1005,7 +1006,7 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts) if (xf86IsOptionSet(FlagOptions, FLAG_PCIFORCENONE)) xf86Info.pciFlags = PCIForceNone; - xf86Info.pmFlag = TRUE; + xf86Info.pmFlag = FALSE; if (xf86GetOptValBool(FlagOptions, FLAG_NOPM, &value)) xf86Info.pmFlag = !value; { @@ -1074,16 +1075,16 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts) else xf86Info.estimateSizesAggressively = 0; - xf86Info.aiglx = TRUE; + xf86Info.aiglx = FALSE; xf86Info.aiglxFrom = X_DEFAULT; if (xf86GetOptValBool(FlagOptions, FLAG_AIGLX, &value)) { xf86Info.aiglx = value; xf86Info.aiglxFrom = X_CONFIG; } - xf86Info.allowEmptyInput = FALSE; + xf86Info.allowEmptyInput = TRUE; if (xf86GetOptValBool(FlagOptions, FLAG_ALLOW_EMPTY_INPUT, &value)) - xf86Info.allowEmptyInput = TRUE; + xf86Info.allowEmptyInput = value; xf86Info.useDefaultFontPath = TRUE; xf86Info.useDefaultFontPathFrom = X_DEFAULT; diff --git a/hw/xfree86/common/xf86Config.h b/hw/xfree86/common/xf86Config.h index 7fc161d..5225641 100644 --- a/hw/xfree86/common/xf86Config.h +++ b/hw/xfree86/common/xf86Config.h @@ -59,8 +59,6 @@ static ModuleDefault ModuleDefaults[] = { {.name = "dbe", .toLoad = TRUE, .load_opt=NULL}, {.name = "glx", .toLoad = TRUE, .load_opt=NULL}, {.name = "freetype", .toLoad = TRUE, .load_opt=NULL}, - {.name = "type1", .toLoad = TRUE, .load_opt=NULL}, - {.name = "record", .toLoad = TRUE, .load_opt=NULL}, {.name = "dri", .toLoad = TRUE, .load_opt=NULL}, {.name = NULL, .toLoad = FALSE, .load_opt=NULL} }; diff --git a/hw/xfree86/common/xf86Globals.c b/hw/xfree86/common/xf86Globals.c index b41fe6e..9541ac5 100644 --- a/hw/xfree86/common/xf86Globals.c +++ b/hw/xfree86/common/xf86Globals.c @@ -127,7 +127,7 @@ xf86InfoRec xf86Info = { #if defined(i386) || defined(__i386__) FALSE, /* pc98 */ #endif - TRUE, /* pmFlag */ + FALSE, /* pmFlag */ LogNone, /* syncLog */ 0, /* estimateSizesAggressively */ FALSE, /* kbdCustomKeycodes */ diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c index 4636af4..0d2b9c6 100644 --- a/hw/xfree86/common/xf86Helper.c +++ b/hw/xfree86/common/xf86Helper.c @@ -1399,7 +1399,7 @@ xf86ErrorF(const char *format, ...) void xf86LogInit() { - char *lf; + char *lf = NULL; #define LOGSUFFIX ".log" #define LOGOLDSUFFIX ".old" @@ -1423,6 +1423,8 @@ xf86LogInit() #undef LOGSUFFIX #undef LOGOLDSUFFIX + + free(lf); } void diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c index 0c9cbd4..26013a7 100644 --- a/hw/xfree86/common/xf86Init.c +++ b/hw/xfree86/common/xf86Init.c @@ -1474,10 +1474,6 @@ ddxProcessArgument(int argc, char **argv, int i) return 1; } #endif - if (!strcmp(argv[i], "-scanpci")) - { - DoScanPci(argc, argv, i); - } if (!strcmp(argv[i], "-probe")) { xf86DoProbe = TRUE; @@ -1539,7 +1535,6 @@ ddxUseMsg() ErrorF("-config file specify a configuration file, relative to the\n"); ErrorF(" "__XCONFIGFILE__" search path, only root can use absolute\n"); ErrorF("-probeonly probe for devices, then exit\n"); - ErrorF("-scanpci execute the scanpci module and exit\n"); ErrorF("-verbose [n] verbose startup messages\n"); ErrorF("-logverbose [n] verbose log messages\n"); ErrorF("-quiet minimal startup messages\n"); @@ -1593,7 +1588,7 @@ ddxUseMsg() static void xf86PrintBanner() { -#if PRE_RELEASE +#if 0 ErrorF("\n" "This is a pre-release version of the X server from " XVENDORNAME ".\n" "It is not supported in any way.\n" diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c index ca2be5c..c67ba18 100644 --- a/hw/xfree86/common/xf86Xinput.c +++ b/hw/xfree86/common/xf86Xinput.c @@ -134,6 +134,11 @@ xf86ProcessCommonOptions(LocalDevicePtr local, /* Backwards compatibility. */ local->history_size = GetMotionHistorySize(); + /* Preallocate xEvent store */ + if (!xf86Events) + xf86Events = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum()); + if (!xf86Events) + FatalError("Couldn't allocate event store\n"); } /*********************************************************************** @@ -462,6 +467,8 @@ DeleteInputDeviceRequest(DeviceIntPtr pDev) * convenient functions to post events */ +#define MAX_VALUATORS 36 /* XXX from comment in dix/getevents.c */ + _X_EXPORT void xf86PostMotionEvent(DeviceIntPtr device, int is_absolute, @@ -471,17 +478,12 @@ xf86PostMotionEvent(DeviceIntPtr device, { va_list var; int i = 0; - static int *valuators = NULL; - static int n_valuators = 0; - - if (num_valuators > n_valuators) { - xfree (valuators); - valuators = NULL; - } + static int valuators[MAX_VALUATORS]; - if (!valuators) { - valuators = xcalloc(sizeof(int), num_valuators); - n_valuators = num_valuators; + if (num_valuators > MAX_VALUATORS) { + xf86Msg(X_ERROR, "xf86PostMotionEvent: num_valuator %d" + " is greater than MAX_VALUATORS\n", num_valuators); + return; } va_start(var, num_valuators); @@ -506,6 +508,12 @@ xf86PostMotionEventP(DeviceIntPtr device, int index; int flags = 0; + if (num_valuators > MAX_VALUATORS) { + xf86Msg(X_ERROR, "xf86PostMotionEvent: num_valuator %d" + " is greater than MAX_VALUATORS\n", num_valuators); + return; + } + if (is_absolute) flags = POINTER_ABSOLUTE; else @@ -530,9 +538,7 @@ xf86PostMotionEventP(DeviceIntPtr device, #endif if (!xf86Events) - xf86Events = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum()); - if (!xf86Events) - FatalError("Couldn't allocate event store\n"); + FatalError("Didn't allocate event store\n"); nevents = GetPointerEvents(xf86Events, device, MotionNotify, 0, flags, first_valuator, num_valuators, @@ -556,9 +562,15 @@ xf86PostProximityEvent(DeviceIntPtr device, ...) { va_list var; - int i, nevents, *valuators = NULL; + int i, nevents; + int valuators[MAX_VALUATORS]; - valuators = xcalloc(sizeof(int), num_valuators); + + if (num_valuators > MAX_VALUATORS) { + xf86Msg(X_ERROR, "xf86PostMotionEvent: num_valuator %d" + " is greater than MAX_VALUATORS\n", num_valuators); + return; + } va_start(var, num_valuators); for (i = 0; i < num_valuators; i++) @@ -566,9 +578,7 @@ xf86PostProximityEvent(DeviceIntPtr device, va_end(var); if (!xf86Events) - xf86Events = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum()); - if (!xf86Events) - FatalError("Couldn't allocate event store\n"); + FatalError("Didn't allocate event store\n"); nevents = GetProximityEvents(xf86Events, device, is_in ? ProximityIn : ProximityOut, @@ -576,7 +586,6 @@ xf86PostProximityEvent(DeviceIntPtr device, for (i = 0; i < nevents; i++) mieqEnqueue(device, xf86Events + i); - xfree(valuators); } _X_EXPORT void @@ -589,7 +598,7 @@ xf86PostButtonEvent(DeviceIntPtr device, ...) { va_list var; - int *valuators = NULL; + int valuators[MAX_VALUATORS]; int i = 0, nevents = 0; int index; @@ -600,18 +609,19 @@ xf86PostButtonEvent(DeviceIntPtr device, return; } #endif + if (num_valuators > MAX_VALUATORS) { + xf86Msg(X_ERROR, "xf86PostMotionEvent: num_valuator %d" + " is greater than MAX_VALUATORS\n", num_valuators); + return; + } - valuators = xcalloc(sizeof(int), num_valuators); - va_start(var, num_valuators); for (i = 0; i < num_valuators; i++) valuators[i] = va_arg(var, int); va_end(var); if (!xf86Events) - xf86Events = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum()); - if (!xf86Events) - FatalError("Couldn't allocate event store\n"); + FatalError("Didn't allocate event store\n"); nevents = GetPointerEvents(xf86Events, device, is_down ? ButtonPress : ButtonRelease, button, @@ -621,8 +631,6 @@ xf86PostButtonEvent(DeviceIntPtr device, for (i = 0; i < nevents; i++) mieqEnqueue(device, xf86Events + i); - - xfree(valuators); } _X_EXPORT void @@ -635,20 +643,24 @@ xf86PostKeyEvent(DeviceIntPtr device, ...) { va_list var; - int i = 0, nevents = 0, *valuators = NULL; + int i = 0, nevents = 0; + static int valuators[MAX_VALUATORS]; /* instil confidence in the user */ DebugF("this function has never been tested properly. if things go quite " "badly south after this message, then xf86PostKeyEvent is " "broken.\n"); + if (num_valuators > MAX_VALUATORS) { + xf86Msg(X_ERROR, "xf86PostMotionEvent: num_valuator %d" + " is greater than MAX_VALUATORS\n", num_valuators); + return; + } + if (!xf86Events) - xf86Events = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum()); - if (!xf86Events) - FatalError("Couldn't allocate event store\n"); + FatalError("Didn't allocate event store\n"); if (is_absolute) { - valuators = xcalloc(sizeof(int), num_valuators); va_start(var, num_valuators); for (i = 0; i < num_valuators; i++) valuators[i] = va_arg(var, int); @@ -658,7 +670,6 @@ xf86PostKeyEvent(DeviceIntPtr device, is_down ? KeyPress : KeyRelease, key_code, first_valuator, num_valuators, valuators); - xfree(valuators); } else { nevents = GetKeyboardEvents(xf86Events, device, @@ -687,9 +698,7 @@ xf86PostKeyboardEvent(DeviceIntPtr device, #endif if (!xf86Events) - xf86Events = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum()); - if (!xf86Events) - FatalError("Couldn't allocate event store\n"); + FatalError("Didn't allocate event store\n"); nevents = GetKeyboardEvents(xf86Events, device, is_down ? KeyPress : KeyRelease, key_code); diff --git a/hw/xfree86/common/xf86str.h b/hw/xfree86/common/xf86str.h index 086d2bf..31b6343 100644 --- a/hw/xfree86/common/xf86str.h +++ b/hw/xfree86/common/xf86str.h @@ -132,6 +132,7 @@ typedef enum { # define M_T_DEFAULT 0x10 /* (VESA) default modes */ # define M_T_USERDEF 0x20 /* One of the modes from the config file */ # define M_T_DRIVER 0x40 /* Supplied by the driver (EDID, etc) */ +# define M_T_USERPREF 0x80 /* mode preferred by the user config */ /* Video mode */ typedef struct _DisplayModeRec { diff --git a/hw/xfree86/dixmods/Makefile.am b/hw/xfree86/dixmods/Makefile.am index 06e6d40..6645b69 100644 --- a/hw/xfree86/dixmods/Makefile.am +++ b/hw/xfree86/dixmods/Makefile.am @@ -40,8 +40,7 @@ extsmodule_LTLIBRARIES = librecord.la \ $(XTRAPMOD) fontsmoduledir = $(moduledir)/fonts -fontsmodule_LTLIBRARIES = libfreetype.la \ - libtype1.la +fontsmodule_LTLIBRARIES = libfreetype.la AM_CFLAGS = @XORG_CFLAGS@ @DIX_CFLAGS@ INCLUDES = @XORG_INCS@ \ @@ -104,9 +103,6 @@ libshadow_la_SOURCES = shmodule.c libfreetype_la_LDFLAGS = -avoid-version libfreetype_la_SOURCES = ftmodule.c -libtype1_la_LDFLAGS = -avoid-version -libtype1_la_SOURCES = type1mod.c - libdixmods_la_SOURCES = $(top_srcdir)/mi/miinitext.c libdixmods_la_CFLAGS = -DXFree86LOADER $(AM_CFLAGS) diff --git a/hw/xfree86/dixmods/extmod/xf86misc.c b/hw/xfree86/dixmods/extmod/xf86misc.c index 3a6f83e..65b00d8 100644 --- a/hw/xfree86/dixmods/extmod/xf86misc.c +++ b/hw/xfree86/dixmods/extmod/xf86misc.c @@ -262,6 +262,7 @@ ProcXF86MiscGetMouseSettings(client) char *devname; pointer mouse; register int n; + int devnamelen; DEBUG_P("XF86MiscGetMouseSettings"); @@ -281,7 +282,7 @@ ProcXF86MiscGetMouseSettings(client) rep.emulate3timeout = MiscExtGetMouseValue(mouse, MISC_MSE_EM3TIMEOUT); rep.chordmiddle = MiscExtGetMouseValue(mouse, MISC_MSE_CHORDMIDDLE); rep.flags = MiscExtGetMouseValue(mouse, MISC_MSE_FLAGS); - rep.devnamelen = (devname? strlen(devname): 0); + devnamelen = rep.devnamelen = (devname? strlen(devname): 0); rep.length = (sizeof(xXF86MiscGetMouseSettingsReply) - sizeof(xGenericReply) + ((rep.devnamelen+3) & ~3)) >> 2; @@ -301,8 +302,8 @@ ProcXF86MiscGetMouseSettings(client) WriteToClient(client, SIZEOF(xXF86MiscGetMouseSettingsReply), (char *)&rep); MiscExtDestroyStruct(mouse, MISC_POINTER); - if (rep.devnamelen) - WriteToClient(client, rep.devnamelen, devname); + if (devnamelen) + WriteToClient(client, devnamelen, devname); return (client->noClientException); } @@ -520,6 +521,7 @@ ProcXF86MiscGetFilePaths(client) const char *modulepath; const char *logfile; register int n; + int configlen, modulelen, loglen; DEBUG_P("XF86MiscGetFilePaths"); @@ -530,9 +532,9 @@ ProcXF86MiscGetFilePaths(client) if (!MiscExtGetFilePaths(&configfile, &modulepath, &logfile)) return BadValue; - rep.configlen = (configfile? strlen(configfile): 0); - rep.modulelen = (modulepath? strlen(modulepath): 0); - rep.loglen = (logfile? strlen(logfile): 0); + configlen = rep.configlen = (configfile? strlen(configfile): 0); + modulelen = rep.modulelen = (modulepath? strlen(modulepath): 0); + loglen = rep.loglen = (logfile? strlen(logfile): 0); rep.length = (SIZEOF(xXF86MiscGetFilePathsReply) - SIZEOF(xGenericReply) + ((rep.configlen + 3) & ~3) + ((rep.modulelen + 3) & ~3) + @@ -547,12 +549,12 @@ ProcXF86MiscGetFilePaths(client) } WriteToClient(client, SIZEOF(xXF86MiscGetFilePathsReply), (char *)&rep); - if (rep.configlen) - WriteToClient(client, rep.configlen, (char *)configfile); - if (rep.modulelen) - WriteToClient(client, rep.modulelen, (char *)modulepath); - if (rep.loglen) - WriteToClient(client, rep.loglen, (char *)logfile); + if (configlen) + WriteToClient(client, configlen, (char *)configfile); + if (modulelen) + WriteToClient(client, modulelen, (char *)modulepath); + if (loglen) + WriteToClient(client, loglen, (char *)logfile); return (client->noClientException); } @@ -565,6 +567,7 @@ ProcXF86MiscPassMessage(client) char *msgtype, *msgval, *retstr; int retval, size; register int n; + int mesglen; REQUEST(xXF86MiscPassMessageReq); @@ -601,7 +604,7 @@ ProcXF86MiscPassMessage(client) rep.type = X_Reply; rep.sequenceNumber = client->sequence; - rep.mesglen = (retstr? strlen(retstr): 0); + mesglen = rep.mesglen = (retstr? strlen(retstr): 0); rep.length = (SIZEOF(xXF86MiscPassMessageReply) - SIZEOF(xGenericReply) + ((rep.mesglen + 3) & ~3)) >> 2; rep.status = 0; @@ -613,8 +616,8 @@ ProcXF86MiscPassMessage(client) } WriteToClient(client, SIZEOF(xXF86MiscPassMessageReply), (char *)&rep); - if (rep.mesglen) - WriteToClient(client, rep.mesglen, (char *)retstr); + if (mesglen) + WriteToClient(client, mesglen, (char *)retstr); xfree(msgtype); xfree(msgval); diff --git a/hw/xfree86/doc/man/xorg.conf.man.pre b/hw/xfree86/doc/man/xorg.conf.man.pre index 3ff5776..1038dcc 100644 --- a/hw/xfree86/doc/man/xorg.conf.man.pre +++ b/hw/xfree86/doc/man/xorg.conf.man.pre @@ -484,7 +484,7 @@ Default: off. .BI "Option \*qAllowMouseOpenFail\*q \*q" boolean \*q This allows the server to start up even if the mouse device can't be opened/initialised. -Default: false. +Default: true. .TP 7 .BI "Option \*qVTInit\*q \*q" command \*q Runs @@ -610,7 +610,7 @@ Default: 0. .TP 7 .BI "Option \*qNoPM\*q \*q" boolean \*q Disables something to do with power management events. -Default: PM enabled on platforms that support it. +Default: PM disabled on platforms that support it. .TP 7 .BI "Option \*qXinerama\*q \*q" boolean \*q enable or disable XINERAMA extension. @@ -662,7 +662,7 @@ action and, if found, use XKEYBOARD for processing actions, otherwise the builtin handler will be used. .TP 7 .BI "Option \*qAIGLX\*q \*q" boolean \*q -enable or disable AIGLX. AIGLX is enabled by default. +enable or disable AIGLX. AIGLX is disabled by default. .TP 7 .BI "Option \*qUseDefaultFontPath\*q \*q" boolean \*q Include the default font path even if other paths are specified in @@ -672,6 +672,20 @@ default. .BI "Option \*qIgnoreABI\*q \*q" boolean \*q Allow modules built for a different, potentially incompatible version of the X server to load. Disabled by default. +.TP 7 +.BI "Option \*qAllowEmptyInput\*q \*q" boolean \*q +If enabled, don't add the standard keyboard and mouse drivers, if there are no +input devices in the config file. Enabled by default. +.TP 7 +.BI "Option \*qAutoAddDevices\*q \*q" boolean \*q +If this option is disabled, then no devices will be added from HAL events. +Disabled by default. +.TP 7 +.BI "Option \*qAutoEnableDevices\*q \*q" boolean \*q +If this option is disabled, then the devices will be added (and the +DevicePresenceNotify event sent), but not enabled, thus leaving policy up +to the client. +Enabled by default. .SH "MODULE SECTION" The .B Module @@ -700,10 +714,10 @@ The standard name is case\-sensitive, and does not include the \(lqlib\(rq prefix, or the \(lq.a\(rq, \(lq.o\(rq, or \(lq.so\(rq suffixes. .PP .RS 7 -Example: the Type 1 font rasteriser can be loaded with the following entry: +Example: the FreeType font rasteriser can be loaded with the following entry: .PP .RS 4 -.B "Load \*qtype1\*q" +.B "Load \*qfreetype\*q" .RE .RE .TP 7 diff --git a/hw/xfree86/int10/helper_exec.c b/hw/xfree86/int10/helper_exec.c index a12a9a0..58e5116 100644 --- a/hw/xfree86/int10/helper_exec.c +++ b/hw/xfree86/int10/helper_exec.c @@ -21,6 +21,8 @@ #define PRINT_PORT 0 #include +#include +#include #include #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) @@ -328,6 +396,8 @@ x_inb(CARD16 port) } #endif /* __NOT_YET__ */ } else if (!pciCfg1inb(port, &val)) { + assert_port_access_allowed (port, sizeof(val)); + val = inb(Int10Current->ioBase + port); if (PRINT_PORT && DEBUG_IO_TRACE()) ErrorF(" inb(%#x) = %2.2x\n", port, val); @@ -350,6 +420,8 @@ x_inw(CARD16 port) X_GETTIMEOFDAY(&tv); val = (CARD16)(tv.tv_usec / 3); } else if (!pciCfg1inw(port, &val)) { + assert_port_access_allowed (port, sizeof(val)); + val = inw(Int10Current->ioBase + port); if (PRINT_PORT && DEBUG_IO_TRACE()) ErrorF(" inw(%#x) = %4.4x\n", port, val); @@ -382,6 +454,8 @@ x_outb(CARD16 port, CARD8 val) } #endif /* __NOT_YET__ */ } else if (!pciCfg1outb(port, val)) { + assert_port_access_allowed (port, sizeof(val)); + if (PRINT_PORT && DEBUG_IO_TRACE()) ErrorF(" outb(%#x, %2.2x)\n", port, val); outb(Int10Current->ioBase + port, val); @@ -393,6 +467,8 @@ x_outw(CARD16 port, CARD16 val) { if (!pciCfg1outw(port, val)) { + assert_port_access_allowed (port, sizeof(val)); + if (PRINT_PORT && DEBUG_IO_TRACE()) ErrorF(" outw(%#x, %4.4x)\n", port, val); outw(Int10Current->ioBase + port, val); @@ -405,6 +481,8 @@ x_inl(CARD16 port) CARD32 val; if (!pciCfg1in(port, &val)) { + assert_port_access_allowed (port, sizeof(val)); + val = inl(Int10Current->ioBase + port); if (PRINT_PORT && DEBUG_IO_TRACE()) ErrorF(" inl(%#x) = %8.8x\n", port, val); @@ -416,6 +494,8 @@ void x_outl(CARD16 port, CARD32 val) { if (!pciCfg1out(port, val)) { + assert_port_access_allowed (port, sizeof(val)); + if (PRINT_PORT && DEBUG_IO_TRACE()) ErrorF(" outl(%#x, %8.8x)\n", port, val); outl(Int10Current->ioBase + port, val); @@ -460,7 +540,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) @@ -470,7 +551,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; @@ -488,7 +569,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; @@ -506,7 +587,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; @@ -529,7 +610,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; @@ -547,7 +628,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; @@ -570,7 +651,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/hw/xfree86/loader/loadmod.c b/hw/xfree86/loader/loadmod.c index 1b5c717..ee43a09 100644 --- a/hw/xfree86/loader/loadmod.c +++ b/hw/xfree86/loader/loadmod.c @@ -177,6 +177,7 @@ InitPathList(const char *path) } if (list) list[n] = NULL; + xfree(fullpath); return list; } @@ -864,7 +865,7 @@ doLoadModule(const char *module, const char *path, const char **subdirlist, for (cim = compiled_in_modules; *cim; cim++) if (!strcmp (module, *cim)) { - xf86MsgVerb(X_INFO, 0, "Module \"%s\" already built-in\n", module); + xf86MsgVerb(X_INFO, 3, "Module \"%s\" already built-in\n", module); return (ModuleDescPtr) 1; } diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index d375da8..da4f83f 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -36,6 +36,7 @@ #include "xf86DDC.h" #include "xf86Crtc.h" #include "xf86Modes.h" +#include "xf86Priv.h" #include "xf86RandR12.h" #include "X11/extensions/render.h" #define DPMS_SERVER @@ -259,6 +260,30 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, crtc->y = y; crtc->rotation = rotation; + /* Shift offsets that move us out of virtual size */ + if (x + mode->HDisplay > xf86_config->maxWidth || + y + mode->VDisplay > xf86_config->maxHeight) + { + if (x + mode->HDisplay > xf86_config->maxWidth) + crtc->x = xf86_config->maxWidth - mode->HDisplay; + if (y + mode->VDisplay > xf86_config->maxHeight) + crtc->y = xf86_config->maxHeight - mode->VDisplay; + if (crtc->x < 0 || crtc->y < 0) + { + xf86DrvMsg (scrn->scrnIndex, X_ERROR, + "Mode %dx%d does not fit virtual size %dx%d - " + "internal error\n", mode->HDisplay, mode->VDisplay, + xf86_config->maxWidth, xf86_config->maxHeight); + goto done; + } + xf86DrvMsg (scrn->scrnIndex, X_ERROR, + "Mode %dx%d+%d+%d does not fit virtual size %dx%d - " + "offset updated to +%d+%d\n", + mode->HDisplay, mode->VDisplay, x, y, + xf86_config->maxWidth, xf86_config->maxHeight, + crtc->x, crtc->y); + } + /* XXX short-circuit changes to base location only */ /* Pass our mode to the outputs and the CRTC to give them a chance to @@ -300,7 +325,7 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, /* Set up the DPLL and any output state that needs to adjust or depend * on the DPLL. */ - crtc->funcs->mode_set(crtc, mode, adjusted_mode, x, y); + crtc->funcs->mode_set(crtc, mode, adjusted_mode, crtc->x, crtc->y); for (i = 0; i < xf86_config->num_output; i++) { xf86OutputPtr output = xf86_config->output[i]; @@ -704,14 +729,15 @@ xf86DefaultMode (xf86OutputPtr output, int width, int height) mm_height = output->mm_height; if (!mm_height) - mm_height = 203; /* 768 pixels at 96dpi */ + mm_height = (768 * 25.4) / DEFAULT_DPI; /* - * Pick a mode closest to 96dpi + * Pick a mode closest to DEFAULT_DPI */ for (mode = output->probed_modes; mode; mode = mode->next) { int dpi; - int preferred = (mode->type & M_T_PREFERRED) != 0; + int preferred = (((mode->type & M_T_PREFERRED) != 0) + + ((mode->type & M_T_USERPREF) != 0)); int diff; if (xf86ModeWidth (mode, output->initial_rotation) > width || @@ -720,7 +746,7 @@ xf86DefaultMode (xf86OutputPtr output, int width, int height) /* yes, use VDisplay here, not xf86ModeHeight */ dpi = (mode->VDisplay * 254) / (mm_height * 10); - diff = dpi - 96; + diff = dpi - DEFAULT_DPI; diff = diff < 0 ? -diff : diff; if (target_mode == NULL || (preferred > target_preferred) || (preferred == target_preferred && diff < target_diff)) @@ -1053,6 +1079,16 @@ xf86InitialOutputPositions (ScrnInfoPtr scrn, DisplayModePtr *modes) any_set = TRUE; continue; } + if (!modes[or]) + { + xf86DrvMsg (scrn->scrnIndex, X_ERROR, + "Cannot position output %s relative to output %s without modes\n", + output->name, relative_name); + output->initial_x = 0; + output->initial_y = 0; + any_set = TRUE; + continue; + } if (relative->initial_x == POSITION_UNSET) { keep_going = TRUE; @@ -1068,10 +1104,10 @@ xf86InitialOutputPositions (ScrnInfoPtr scrn, DisplayModePtr *modes) output->initial_x += xf86ModeWidth (modes[or], relative->initial_rotation); break; case OPTION_ABOVE: - output->initial_y -= xf86ModeHeight (modes[or], relative->initial_rotation); + output->initial_y -= xf86ModeHeight (modes[o], relative->initial_rotation); break; case OPTION_LEFT_OF: - output->initial_x -= xf86ModeWidth (modes[or], relative->initial_rotation); + output->initial_x -= xf86ModeWidth (modes[o], relative->initial_rotation); break; default: break; @@ -1214,6 +1250,23 @@ xf86SortModes (DisplayModePtr input) return output; } +static char * +preferredMode(ScrnInfoPtr pScrn, xf86OutputPtr output) +{ + char *preferred_mode = NULL; + + /* Check for a configured preference for a particular mode */ + preferred_mode = xf86GetOptValString (output->options, + OPTION_PREFERRED_MODE); + if (preferred_mode) + return preferred_mode; + + if (pScrn->display->modes && *pScrn->display->modes) + preferred_mode = *pScrn->display->modes; + + return preferred_mode; +} + _X_EXPORT void xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY) { @@ -1395,8 +1448,7 @@ xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY) output->probed_modes = xf86SortModes (output->probed_modes); /* Check for a configured preference for a particular mode */ - preferred_mode = xf86GetOptValString (output->options, - OPTION_PREFERRED_MODE); + preferred_mode = preferredMode(scrn, output); if (preferred_mode) { @@ -1415,10 +1467,9 @@ xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY) mode->prev = NULL; output->probed_modes = mode; } - mode->type |= M_T_PREFERRED; + mode->type |= (M_T_PREFERRED|M_T_USERPREF); + break; } - else - mode->type &= ~M_T_PREFERRED; } } @@ -1532,6 +1583,7 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow) xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); int o, c; DisplayModePtr target_mode = NULL; + int target_preferred = 0; Rotation target_rotation = RR_Rotate_0; xf86CrtcPtr *crtcs; DisplayModePtr *modes; @@ -1572,43 +1624,34 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow) } /* - * Let outputs with preferred modes drive screen size + * User preferred > preferred > other modes */ for (o = 0; o < config->num_output; o++) { - xf86OutputPtr output = config->output[o]; + xf86OutputPtr output = config->output[o]; + DisplayModePtr default_mode; + int default_preferred; - if (enabled[o] && - xf86OutputHasPreferredMode (output, width, height)) + if (!enabled[o]) + continue; + default_mode = xf86DefaultMode (output, width, height); + if (!default_mode) + continue; + default_preferred = (((default_mode->type & M_T_PREFERRED) != 0) + + ((default_mode->type & M_T_USERPREF) != 0)); + if (default_preferred > target_preferred || !target_mode) { - target_mode = xf86DefaultMode (output, width, height); + target_mode = default_mode; + target_preferred = default_preferred; target_rotation = output->initial_rotation; - if (target_mode) - { - modes[o] = target_mode; - config->compat_output = o; - break; - } - } - } - if (!target_mode) - { - for (o = 0; o < config->num_output; o++) - { - xf86OutputPtr output = config->output[o]; - if (enabled[o]) - { - target_mode = xf86DefaultMode (output, width, height); - target_rotation = output->initial_rotation; - if (target_mode) - { - modes[o] = target_mode; - config->compat_output = o; - break; - } - } + config->compat_output = o; } } + if (target_mode) + modes[config->compat_output] = target_mode; + /* + * Fill in other output modes + */ for (o = 0; o < config->num_output; o++) { xf86OutputPtr output = config->output[o]; diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h index 9693e12..4c843cd 100644 --- a/hw/xfree86/modes/xf86Crtc.h +++ b/hw/xfree86/modes/xf86Crtc.h @@ -39,6 +39,9 @@ #ifndef M_T_DRIVER #define M_T_DRIVER 0x40 #endif +#ifndef M_T_USERPREF +#define M_T_USERPREF 0x80 +#endif #ifndef HARDWARE_CURSOR_ARGB #define HARDWARE_CURSOR_ARGB 0x00004000 #endif diff --git a/hw/xfree86/modes/xf86EdidModes.c b/hw/xfree86/modes/xf86EdidModes.c index e2ae665..96d3d67 100644 --- a/hw/xfree86/modes/xf86EdidModes.c +++ b/hw/xfree86/modes/xf86EdidModes.c @@ -407,8 +407,10 @@ xf86DDCMonitorSet(int scrnIndex, MonPtr Monitor, xf86MonPtr DDC) Monitor->DDC = DDC; - Monitor->widthmm = 10 * DDC->features.hsize; - Monitor->heightmm = 10 * DDC->features.vsize; + if (Monitor->widthmm <= 0 && Monitor->heightmm <= 0) { + Monitor->widthmm = 10 * DDC->features.hsize; + Monitor->heightmm = 10 * DDC->features.vsize; + } /* If this is a digital display, then we can use reduced blanking */ if (DDC->features.input_type) diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c index 7169f74..5b8c639 100644 --- a/hw/xfree86/modes/xf86RandR12.c +++ b/hw/xfree86/modes/xf86RandR12.c @@ -450,10 +450,10 @@ xf86RandR12CreateScreenResources (ScreenPtr pScreen) else { /* - * Otherwise, just set the screen to 96dpi + * Otherwise, just set the screen to DEFAULT_DPI */ - mmWidth = width * 25.4 / 96; - mmHeight = height * 25.4 / 96; + mmWidth = width * 25.4 / DEFAULT_DPI; + mmHeight = height * 25.4 / DEFAULT_DPI; } } xf86DrvMsg(pScrn->scrnIndex, X_INFO, @@ -683,11 +683,8 @@ xf86RandRModeConvert (ScrnInfoPtr scrn, RRModePtr randr_mode, DisplayModePtr mode) { - mode->prev = NULL; - mode->next = NULL; - mode->name = NULL; + memset(mode, 0, sizeof(DisplayModeRec)); mode->status = MODE_OK; - mode->type = 0; mode->Clock = randr_mode->mode.dotClock / 1000; diff --git a/hw/xfree86/modes/xf86Rotate.c b/hw/xfree86/modes/xf86Rotate.c index dd0e659..e2d6295 100644 --- a/hw/xfree86/modes/xf86Rotate.c +++ b/hw/xfree86/modes/xf86Rotate.c @@ -494,7 +494,8 @@ xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation) { ScrnInfoPtr pScrn = crtc->scrn; xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); - ScreenPtr pScreen = pScrn->pScreen; + /* if this is called during ScreenInit() we don't have pScrn->pScreen yet */ + ScreenPtr pScreen = screenInfo.screens[pScrn->scrnIndex]; PictTransform crtc_to_fb, fb_to_crtc; PictureTransformIdentity (&crtc_to_fb); diff --git a/hw/xfree86/os-support/linux/lnx_acpi.c b/hw/xfree86/os-support/linux/lnx_acpi.c index 024e6ef..898678e 100644 --- a/hw/xfree86/os-support/linux/lnx_acpi.c +++ b/hw/xfree86/os-support/linux/lnx_acpi.c @@ -69,9 +69,11 @@ lnxACPIGetEventFromOs(int fd, pmEvent *events, int num) TimerSet(NULL, 0, ACPI_REOPEN_DELAY, lnxACPIReopen, NULL); return 0; } + /* FIXME: this only processes the first read ACPI event & might break + * with interrupted reads. */ /* Check that we have a video event */ - if (strstr(ev, "video") == ev) { + if (!strncmp(ev, "video", 5)) { char *video = NULL; char *GFX = NULL; char *notify = NULL; @@ -97,26 +99,19 @@ lnxACPIGetEventFromOs(int fd, pmEvent *events, int num) ErrorF("data: 0x%lx\n",data_l); #endif - /* We currently don't differentiate between any event */ + /* Differentiate between events */ switch (notify_l) { case ACPI_VIDEO_NOTIFY_SWITCH: - break; - case ACPI_VIDEO_NOTIFY_PROBE: - break; case ACPI_VIDEO_NOTIFY_CYCLE: - break; case ACPI_VIDEO_NOTIFY_NEXT_OUTPUT: - break; case ACPI_VIDEO_NOTIFY_PREV_OUTPUT: - break; + events[0] = XF86_APM_CAPABILITY_CHANGED; + return 1; + case ACPI_VIDEO_NOTIFY_PROBE: + return 0; default: - break; + return 0; } - - /* Deal with all ACPI events as a capability change */ - events[0] = XF86_APM_CAPABILITY_CHANGED; - - return 1; } return 0; diff --git a/hw/xfree86/os-support/linux/lnx_video.c b/hw/xfree86/os-support/linux/lnx_video.c index b3494a7..410ae0d 100644 --- a/hw/xfree86/os-support/linux/lnx_video.c +++ b/hw/xfree86/os-support/linux/lnx_video.c @@ -142,17 +142,8 @@ mtrr_open(int verbosity) /* Only report absence of /proc/mtrr once. */ static Bool warned = FALSE; - char **fn; - static char *mtrr_files[] = { - "/dev/cpu/mtrr", /* Possible future name */ - "/proc/mtrr", /* Current name */ - NULL - }; - if (mtrr_fd == MTRR_FD_UNOPENED) { - /* So open it. */ - for (fn = mtrr_files; mtrr_fd < 0 && *fn; fn++) - mtrr_fd = open(*fn, O_WRONLY); + mtrr_fd = open("/proc/mtrr", O_WRONLY); if (mtrr_fd < 0) mtrr_fd = MTRR_FD_PROBLEM; diff --git a/hw/xfree86/parser/Makefile.am b/hw/xfree86/parser/Makefile.am index 849ee8b..9786711 100644 --- a/hw/xfree86/parser/Makefile.am +++ b/hw/xfree86/parser/Makefile.am @@ -1,13 +1,11 @@ -if INSTALL_LIBXF86CONFIG -lib_LIBRARIES = libxf86config.a +lib_LTLIBRARIES = libxf86config.la LIBHEADERS = \ xf86Optrec.h \ xf86Parser.h -else -noinst_LIBRARIES = libxf86config.a -endif -libxf86config_a_SOURCES = \ +libxf86config_la_LDFLAGS = -version-number 6:9:99 +libxf86config_la_LIBADD = $(XF86CONFIG_LIBS) -lm +libxf86config_la_SOURCES = \ Device.c \ Files.c \ Flags.c \ @@ -23,7 +21,8 @@ libxf86config_a_SOURCES = \ scan.c \ write.c \ DRI.c \ - Extensions.c + Extensions.c \ + error.c AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS) @@ -35,7 +34,5 @@ EXTRA_DIST = \ xf86tokens.h \ cpconfig.c -sdk_HEADERS = \ - $(LIBHEADERS) \ - xf86Parser.h \ - xf86Optrec.h +xf86configincludedir=$(includedir)/xorg +xf86configinclude_HEADERS = $(LIBHEADERS) diff --git a/hw/xfree86/parser/Module.c b/hw/xfree86/parser/Module.c index 2012ce6..b62bf62 100644 --- a/hw/xfree86/parser/Module.c +++ b/hw/xfree86/parser/Module.c @@ -225,6 +225,19 @@ xf86printModuleSection (FILE * cf, XF86ConfModulePtr ptr) #endif } } + for (lptr = ptr->mod_disable_lst; lptr; lptr = lptr->list.next) + { + switch (lptr->load_type) + { + case XF86_DISABLE_MODULE: + fprintf (cf, "\tDisable \"%s\"", lptr->load_name); + if (lptr->load_comment) + fprintf(cf, "%s", lptr->load_comment); + else + fputc('\n', cf); + break; + } + } } XF86LoadPtr diff --git a/hw/xfree86/parser/Monitor.c b/hw/xfree86/parser/Monitor.c index 4bff4b2..9d53312 100644 --- a/hw/xfree86/parser/Monitor.c +++ b/hw/xfree86/parser/Monitor.c @@ -688,8 +688,6 @@ xf86printMonitorSection (FILE * cf, XF86ConfMonitorPtr ptr) fprintf (cf, "\tDisplaySize %d\t%d\n", ptr->mon_width, ptr->mon_height); - if ( ptr->mon_n_hsync || ptr->mon_n_vrefresh ) - fprintf(cf," ### Comment all HorizSync and VertRefresh values to use DDC:\n"); for (i = 0; i < ptr->mon_n_hsync; i++) { fprintf (cf, "\tHorizSync %2.1f - %2.1f\n", diff --git a/hw/xfree86/parser/cpconfig.c b/hw/xfree86/parser/cpconfig.c index 46a5a8b..d284ecd 100644 --- a/hw/xfree86/parser/cpconfig.c +++ b/hw/xfree86/parser/cpconfig.c @@ -102,21 +102,3 @@ main (int argc, char *argv[]) } exit(0); } - -/* Functions that the parser requires */ - -_X_EXPORT void -VErrorF(const char *f, va_list args) -{ - vfprintf(stderr, f, args); -} - -_X_EXPORT void -ErrorF(const char *f, ...) -{ - va_list args; - - va_start(args, f); - vfprintf(stderr, f, args); - va_end(args); -} diff --git a/hw/xfree86/parser/error.c b/hw/xfree86/parser/error.c new file mode 100644 index 0000000..b00b380 --- /dev/null +++ b/hw/xfree86/parser/error.c @@ -0,0 +1,20 @@ +#include +#include +#include "xf86Parser.h" + +/* Functions that the parser requires */ + +void +VErrorF(const char *f, va_list args) +{ + vfprintf(stderr, f, args); +} + +void +ErrorF(const char *f, ...) +{ + va_list args; + va_start(args, f); + vfprintf(stderr, f, args); + va_end(args); +} diff --git a/hw/xfree86/scanpci/Makefile.am b/hw/xfree86/scanpci/Makefile.am index d4d9da2..81e2a4b 100644 --- a/hw/xfree86/scanpci/Makefile.am +++ b/hw/xfree86/scanpci/Makefile.am @@ -1,10 +1,8 @@ -module_LTLIBRARIES = libscanpci.la libpcidata.la +module_LTLIBRARIES = libpcidata.la libpcidata_la_LDFLAGS = -avoid-version -libscanpci_la_LDFLAGS = -avoid-version libpcidata_la_SOURCES = xf86PciData.c -libscanpci_la_SOURCES = xf86ScanPci.c INCLUDES = $(XORG_INCS) diff --git a/hw/xfree86/utils/Makefile.am b/hw/xfree86/utils/Makefile.am index 38f90b4..5516715 100644 --- a/hw/xfree86/utils/Makefile.am +++ b/hw/xfree86/utils/Makefile.am @@ -4,6 +4,5 @@ SUBDIRS = \ ioport \ kbd_mode \ pcitweak \ - scanpci \ xorgcfg \ xorgconfig diff --git a/hw/xfree86/utils/xorgcfg/Makefile.am b/hw/xfree86/utils/xorgcfg/Makefile.am index 309ed5c..f0e3e61 100644 --- a/hw/xfree86/utils/xorgcfg/Makefile.am +++ b/hw/xfree86/utils/xorgcfg/Makefile.am @@ -31,12 +31,12 @@ bin_PROGRAMS = xorgcfg INCLUDES = $(XORG_INCS) -I$(top_srcdir)/hw/xfree86/parser -OPTIONSPATH=$(libdir)/X11 +OPTIONSPATH=$(libdir)/X11 xorgcfg_CFLAGS = $(XORG_CFLAGS) $(CURSESDEFINES) \ $(XORGCFG_DEP_CFLAGS) -DXKB_RULES_DIR=\"$(XKB_BASE_DIRECTORY)/rules\" \ -DPROJECT_ROOT=\"$(PROJECTROOT)\" -DOPTIONSPATH=\"$(OPTIONSPATH)\" -xorgcfg_LDADD = $(XORGCFG_DEP_LIBS) ../../parser/libxf86config.a $(LOADERLIB) \ +xorgcfg_LDADD = $(XORGCFG_DEP_LIBS) ../../parser/libxf86config.la $(LOADERLIB) \ ../../os-support/libxorgos.la ../../dummylib/libdummy-nonserver.a \ ${SYS_LIBS} diff --git a/hw/xfree86/vbe/vbe.c b/hw/xfree86/vbe/vbe.c index 06559bb..8af1727 100644 --- a/hw/xfree86/vbe/vbe.c +++ b/hw/xfree86/vbe/vbe.c @@ -1019,7 +1019,7 @@ VBEGetPixelClock(vbeInfoPtr pVbe, int mode, int clock) /* Input: AX := 4F0Bh VBE Get Pixel Clock - BL := 01h Get Pixel Clock + BL := 00h Get Pixel Clock ECX := pixel clock in units of Hz DX := mode number @@ -1030,7 +1030,7 @@ VBEGetPixelClock(vbeInfoPtr pVbe, int mode, int clock) pVbe->pInt10->num = 0x10; pVbe->pInt10->ax = 0x4f0b; - pVbe->pInt10->bx = 0x01; + pVbe->pInt10->bx = 0x00; pVbe->pInt10->cx = clock; pVbe->pInt10->dx = mode; xf86ExecX86int10(pVbe->pInt10); 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 b9e7257..b42cdc0 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,63 @@ 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 + /* If the platform allows it, we will base our values on the real + * results from the CPUID instruction. We limit support to the + * first two features, and the results of those are sanitized. + */ + if (feature <= 1) + hw_cpuid(&M.x86.R_EAX, &M.x86.R_EBX, &M.x86.R_ECX, &M.x86.R_EDX); +#endif + + switch (feature) { + case 0: + /* Regardless if we have real data from the hardware, the emulator + * will only support upto feature 1, which we set in register EAX. + * Registers EBX:EDX:ECX contain a string identifying the CPU. + */ + M.x86.R_EAX = 1; +#ifndef X86EMU_HAS_HW_CPUID + /* EBX:EDX:ECX = "GenuineIntel" */ + M.x86.R_EBX = 0x756e6547; + M.x86.R_EDX = 0x49656e69; + M.x86.R_ECX = 0x6c65746e; +#endif + break; + case 1: +#ifndef X86EMU_HAS_HW_CPUID + /* If we don't have x86 compatible hardware, we return values from an + * Intel 486dx4; which was one of the first processors to have CPUID. + */ + M.x86.R_EAX = 0x00000480; + M.x86.R_EBX = 0x00000000; + M.x86.R_ECX = 0x00000000; + M.x86.R_EDX = 0x00000002; /* VME */ +#else + /* In the case that we have hardware CPUID instruction, we make sure + * that the features reported are limited to TSC and VME. + */ + M.x86.R_EDX &= 0x00000012; +#endif + break; + default: + /* Finally, we don't support any additional features. Most CPUs + * return all zeros when queried for invalid or unsupported feature + * numbers. + */ + M.x86.R_EAX = 0; + 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..af61e20 --- /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 diff --git a/hw/xfree86/xaa/xaaInit.c b/hw/xfree86/xaa/xaaInit.c index 529dbd1..7b45ade 100644 --- a/hw/xfree86/xaa/xaaInit.c +++ b/hw/xfree86/xaa/xaaInit.c @@ -92,6 +92,30 @@ XAADestroyInfoRec(XAAInfoRecPtr infoRec) xfree(infoRec); } +void +XAAEvictPixmaps(void) +{ + XAAScreenPtr pScreenPriv; + XAAInfoRecPtr infoRec; + ScreenPtr pScreen; + int i; + + xf86MsgVerb(X_INFO, 3, "XAA: Evicting pixmaps\n"); + + for (i = 0; i < screenInfo.numScreens; i++) { + pScreen = screenInfo.screens[i]; + infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen); + + pScreenPriv = pScreen->devPrivates[XAAScreenIndex].ptr; + infoRec = pScreenPriv->AccelInfoRec; + + infoRec->offscreenDepths = 0; + infoRec->Flags &= ~OFFSCREEN_PIXMAPS; + + XAAMoveOutOffscreenPixmaps(pScreen); + XAAInvalidatePixmapCache(pScreen); + } +} Bool XAAInit(ScreenPtr pScreen, XAAInfoRecPtr infoRec) diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c index db5007e..43cfb29 100644 --- a/randr/rrcrtc.c +++ b/randr/rrcrtc.c @@ -150,7 +150,8 @@ RRCrtcNotify (RRCrtcPtr crtc, break; if (i == numOutputs) { - crtc->outputs[j]->crtc = NULL; + if (crtc->outputs[j]->crtc == crtc) + crtc->outputs[j]->crtc = NULL; RROutputChanged (crtc->outputs[j], FALSE); RRCrtcChanged (crtc, FALSE); } diff --git a/render/glyph.c b/render/glyph.c index 42ae65d..a2e1074 100644 --- a/render/glyph.c +++ b/render/glyph.c @@ -449,7 +449,7 @@ FindGlyphRef (GlyphHashPtr hash, CARD32 signature, Bool match, GlyphPtr compare) } else if (s == signature && (!match || - memcmp (&compare->info, &glyph->info, compare->size) == 0)) + memcmp (&compare->info, &glyph->info, glyph->size < compare->size ? glyph->size : compare->size) == 0)) { break; } diff --git a/render/miindex.c b/render/miindex.c index 0e12dca..4e0cf00 100644 --- a/render/miindex.c +++ b/render/miindex.c @@ -147,6 +147,7 @@ miBuildRenderColormap (ColormapPtr pColormap, Pixel *pixels, int *nump) for (g = 0; g < cube; g++) for (b = 0; b < cube; b++) { + pixel = 0; red = (r * 65535 + (cube-1)/2) / (cube - 1); green = (g * 65535 + (cube-1)/2) / (cube - 1); blue = (b * 65535 + (cube-1)/2) / (cube - 1); @@ -157,6 +158,7 @@ miBuildRenderColormap (ColormapPtr pColormap, Pixel *pixels, int *nump) } for (g = 0; g < gray; g++) { + pixel = 0; red = green = blue = (g * 65535 + (gray-1)/2) / (gray - 1); if (AllocColor (pColormap, &red, &green, &blue, &pixel, 0) != Success) return FALSE; diff --git a/render/picture.c b/render/picture.c index 5ddd68c..01cf5d5 100644 --- a/render/picture.c +++ b/render/picture.c @@ -68,9 +68,11 @@ AllocatePicturePrivateIndex (void) Bool AllocatePicturePrivate (ScreenPtr pScreen, int index2, unsigned int amount) { - PictureScreenPtr ps = GetPictureScreen(pScreen); + PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); unsigned int oldamount; + if (!ps) return TRUE; + /* Round up sizes for proper alignment */ amount = ((amount + (sizeof(long) - 1)) / sizeof(long)) * sizeof(long); diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c index ce4df4c..0ecef6f 100644 --- a/xkb/xkbUtils.c +++ b/xkb/xkbUtils.c @@ -1784,6 +1784,7 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies) return FALSE; dsection->rows = tmp; } + dsection->num_rows = ssection->num_rows; for (j = 0, srow = ssection->rows, drow = dsection->rows; j < ssection->num_rows; j++, srow++, drow++) {