mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2026-01-07 18:20:14 +01:00
Merge branch 'server-1.5-branch' into xorg-server-1.5-apple
This commit is contained in:
commit
d451f3d146
30 changed files with 555 additions and 702 deletions
|
|
@ -490,9 +490,11 @@ nooverride:
|
|||
|
||||
data = xalloc(pitch * pixmap->drawable.height);
|
||||
|
||||
__glXenterServer(GL_FALSE);
|
||||
pScreen->GetImage(&pixmap->drawable, 0 /*pixmap->drawable.x*/,
|
||||
0 /*pixmap->drawable.y*/, pixmap->drawable.width,
|
||||
pixmap->drawable.height, ZPixmap, ~0, data);
|
||||
__glXleaveServer(GL_FALSE);
|
||||
|
||||
if (pixmap->drawable.depth == 24)
|
||||
glxFillAlphaChannel(data,
|
||||
|
|
@ -534,9 +536,11 @@ nooverride:
|
|||
pixmap->drawable.depth);
|
||||
void *data = xalloc(pitch * (p[i].y2 - p[i].y1));
|
||||
|
||||
__glXenterServer(GL_FALSE);
|
||||
pScreen->GetImage(&pixmap->drawable, /*pixmap->drawable.x +*/ p[i].x1,
|
||||
/*pixmap->drawable.y*/ + p[i].y1, p[i].x2 - p[i].x1,
|
||||
p[i].y2 - p[i].y1, ZPixmap, ~0, data);
|
||||
__glXleaveServer(GL_FALSE);
|
||||
|
||||
if (pixmap->drawable.depth == 24)
|
||||
glxFillAlphaChannel(data,
|
||||
|
|
|
|||
|
|
@ -420,10 +420,13 @@ findFirstSet(unsigned int v)
|
|||
static void
|
||||
initGlxVisual(VisualPtr visual, __GLXconfig *config)
|
||||
{
|
||||
int maxBits;
|
||||
maxBits = max(config->redBits, max(config->greenBits, config->blueBits));
|
||||
|
||||
config->visualID = visual->vid;
|
||||
visual->class = glxConvertToXVisualType(config->visualType);
|
||||
visual->bitsPerRGBValue = config->redBits;
|
||||
visual->ColormapEntries = 1 << config->redBits;
|
||||
visual->bitsPerRGBValue = maxBits;
|
||||
visual->ColormapEntries = 1 << maxBits;
|
||||
visual->nplanes = config->redBits + config->greenBits + config->blueBits;
|
||||
|
||||
visual->redMask = config->redMask;
|
||||
|
|
|
|||
|
|
@ -679,15 +679,19 @@ SProcSecurityGenerateAuthorization(
|
|||
register char n;
|
||||
CARD32 *values;
|
||||
unsigned long nvalues;
|
||||
int values_offset;
|
||||
|
||||
swaps(&stuff->length, n);
|
||||
REQUEST_AT_LEAST_SIZE(xSecurityGenerateAuthorizationReq);
|
||||
swaps(&stuff->nbytesAuthProto, n);
|
||||
swaps(&stuff->nbytesAuthData, n);
|
||||
swapl(&stuff->valueMask, n);
|
||||
values = (CARD32 *)(&stuff[1]) +
|
||||
((stuff->nbytesAuthProto + (unsigned)3) >> 2) +
|
||||
((stuff->nbytesAuthData + (unsigned)3) >> 2);
|
||||
values_offset = ((stuff->nbytesAuthProto + (unsigned)3) >> 2) +
|
||||
((stuff->nbytesAuthData + (unsigned)3) >> 2);
|
||||
if (values_offset >
|
||||
stuff->length - (sz_xSecurityGenerateAuthorizationReq >> 2))
|
||||
return BadLength;
|
||||
values = (CARD32 *)(&stuff[1]) + values_offset;
|
||||
nvalues = (((CARD32 *)stuff) + stuff->length) - values;
|
||||
SwapLongs(values, nvalues);
|
||||
return ProcSecurityGenerateAuthorization(client);
|
||||
|
|
|
|||
13
Xext/shm.c
13
Xext/shm.c
|
|
@ -894,8 +894,17 @@ ProcShmPutImage(client)
|
|||
return BadValue;
|
||||
}
|
||||
|
||||
VERIFY_SHMSIZE(shmdesc, stuff->offset, length * stuff->totalHeight,
|
||||
client);
|
||||
/*
|
||||
* There's a potential integer overflow in this check:
|
||||
* VERIFY_SHMSIZE(shmdesc, stuff->offset, length * stuff->totalHeight,
|
||||
* client);
|
||||
* the version below ought to avoid it
|
||||
*/
|
||||
if (stuff->totalHeight != 0 &&
|
||||
length > (shmdesc->size - stuff->offset)/stuff->totalHeight) {
|
||||
client->errorValue = stuff->totalWidth;
|
||||
return BadValue;
|
||||
}
|
||||
if (stuff->srcX > stuff->totalWidth)
|
||||
{
|
||||
client->errorValue = stuff->srcX;
|
||||
|
|
|
|||
|
|
@ -2031,6 +2031,8 @@ SELinuxExtensionInit(INITARGS)
|
|||
ProcSELinuxDispatch, SProcSELinuxDispatch,
|
||||
SELinuxResetProc, StandardMinorOpcode);
|
||||
|
||||
AddExtensionAlias("Flask", extEntry);
|
||||
|
||||
/* Label objects that were created before we could register ourself */
|
||||
SELinuxLabelInitial();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -123,9 +123,14 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr other, int count)
|
|||
deviceValuator *xV = (deviceValuator *) xE;
|
||||
|
||||
if (xE->u.u.type != DeviceValuator) {
|
||||
GetSpritePosition(&rootX, &rootY);
|
||||
xE->u.keyButtonPointer.rootX = rootX;
|
||||
xE->u.keyButtonPointer.rootY = rootY;
|
||||
/* Other types already have root{X,Y} filled in. */
|
||||
if (xE->u.u.type == DeviceKeyPress ||
|
||||
xE->u.u.type == DeviceKeyRelease) {
|
||||
GetSpritePosition(&rootX, &rootY);
|
||||
xE->u.keyButtonPointer.rootX = rootX;
|
||||
xE->u.keyButtonPointer.rootY = rootY;
|
||||
}
|
||||
|
||||
key = xE->u.u.detail;
|
||||
NoticeEventTime(xE);
|
||||
xE->u.keyButtonPointer.state = inputInfo.keyboard->key->state |
|
||||
|
|
|
|||
|
|
@ -82,6 +82,9 @@ compRedirectWindow (ClientPtr pClient, WindowPtr pWin, int update)
|
|||
return Success;
|
||||
}
|
||||
|
||||
if (!pWin->parent)
|
||||
return BadMatch;
|
||||
|
||||
/*
|
||||
* Only one Manual update is allowed
|
||||
*/
|
||||
|
|
|
|||
277
config/hal.c
277
config/hal.c
|
|
@ -38,19 +38,30 @@
|
|||
#include "config-backends.h"
|
||||
#include "os.h"
|
||||
|
||||
#define TYPE_NONE 0
|
||||
#define TYPE_KEYS 1
|
||||
#define TYPE_POINTER 2
|
||||
|
||||
#define LIBHAL_PROP_KEY "input.x11_options."
|
||||
#define LIBHAL_XKB_PROP_KEY "input.xkb."
|
||||
|
||||
|
||||
struct config_hal_info {
|
||||
DBusConnection *system_bus;
|
||||
LibHalContext *hal_ctx;
|
||||
};
|
||||
|
||||
/* Used for special handling of xkb options. */
|
||||
struct xkb_options {
|
||||
char* layout;
|
||||
char* model;
|
||||
char* rules;
|
||||
char* variant;
|
||||
};
|
||||
|
||||
|
||||
static void
|
||||
remove_device(DeviceIntPtr dev)
|
||||
{
|
||||
DebugF("[config/hal] removing device %s\n", dev->name);
|
||||
/* this only gets called for devices that have already been added */
|
||||
LogMessage(X_INFO, "config/hal: removing device %s\n", dev->name);
|
||||
|
||||
/* Call PIE here so we don't try to dereference a device that's
|
||||
* already been removed. */
|
||||
|
|
@ -107,7 +118,7 @@ get_prop_string(LibHalContext *hal_ctx, const char *udi, const char *name)
|
|||
char *prop, *ret;
|
||||
|
||||
prop = libhal_device_get_property_string(hal_ctx, udi, name, NULL);
|
||||
DebugF("[config/hal] getting %s on %s returned %s\n", name, udi, prop);
|
||||
LogMessageVerb(X_INFO, 10, "config/hal: getting %s on %s returned %s\n", name, udi, prop);
|
||||
if (prop) {
|
||||
ret = xstrdup(prop);
|
||||
libhal_free_string(prop);
|
||||
|
|
@ -119,6 +130,9 @@ get_prop_string(LibHalContext *hal_ctx, const char *udi, const char *name)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* this function is no longer used... keep it here in case its needed in
|
||||
* the future. */
|
||||
#if 0
|
||||
static char *
|
||||
get_prop_string_array(LibHalContext *hal_ctx, const char *udi, const char *prop)
|
||||
{
|
||||
|
|
@ -152,117 +166,215 @@ get_prop_string_array(LibHalContext *hal_ctx, const char *udi, const char *prop)
|
|||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
device_added(LibHalContext *hal_ctx, const char *udi)
|
||||
{
|
||||
char **props;
|
||||
char *path = NULL, *driver = NULL, *name = NULL, *xkb_rules = NULL;
|
||||
char *xkb_model = NULL, *xkb_layout = NULL, *xkb_variant = NULL;
|
||||
char *xkb_options = NULL, *config_info = NULL;
|
||||
char *path = NULL, *driver = NULL, *name = NULL, *config_info = NULL;
|
||||
InputOption *options = NULL, *tmpo = NULL;
|
||||
DeviceIntPtr dev;
|
||||
DBusError error;
|
||||
int type = TYPE_NONE;
|
||||
int i;
|
||||
struct xkb_options xkb_opts = {0};
|
||||
|
||||
LibHalPropertySet *set = NULL;
|
||||
LibHalPropertySetIterator set_iter;
|
||||
char *psi_key = NULL, *tmp_val;
|
||||
|
||||
|
||||
dbus_error_init(&error);
|
||||
|
||||
props = libhal_device_get_property_strlist(hal_ctx, udi,
|
||||
"info.capabilities", &error);
|
||||
if (!props) {
|
||||
DebugF("[config/hal] couldn't get capabilities for %s: %s (%s)\n",
|
||||
udi, error.name, error.message);
|
||||
goto out_error;
|
||||
}
|
||||
for (i = 0; props[i]; i++) {
|
||||
/* input.keys is the new, of which input.keyboard is a subset, but
|
||||
* input.keyboard is the old 'we have keys', so we have to keep it
|
||||
* around. */
|
||||
if (strcmp(props[i], "input.keys") == 0 ||
|
||||
strcmp(props[i], "input.keyboard") == 0)
|
||||
type |= TYPE_KEYS;
|
||||
if (strcmp(props[i], "input.mouse") == 0 ||
|
||||
strcmp(props[i], "input.touchpad") == 0)
|
||||
type |= TYPE_POINTER;
|
||||
}
|
||||
libhal_free_string_array(props);
|
||||
|
||||
if (type == TYPE_NONE)
|
||||
goto out_error;
|
||||
|
||||
driver = get_prop_string(hal_ctx, udi, "input.x11_driver");
|
||||
path = get_prop_string(hal_ctx, udi, "input.device");
|
||||
if (!driver || !path) {
|
||||
DebugF("[config/hal] no driver or path specified for %s\n", udi);
|
||||
if (!driver){
|
||||
/* verbose, don't tell the user unless they _want_ to see it */
|
||||
LogMessageVerb(X_INFO,7,"config/hal: no driver specified for device %s\n", udi);
|
||||
goto unwind;
|
||||
}
|
||||
|
||||
path = get_prop_string(hal_ctx, udi, "input.device");
|
||||
if (!path) {
|
||||
LogMessage(X_WARNING,"config/hal: no driver or path specified for %s\n", udi);
|
||||
goto unwind;
|
||||
}
|
||||
|
||||
name = get_prop_string(hal_ctx, udi, "info.product");
|
||||
if (!name)
|
||||
name = xstrdup("(unnamed)");
|
||||
|
||||
if (type & TYPE_KEYS) {
|
||||
xkb_rules = get_prop_string(hal_ctx, udi, "input.xkb.rules");
|
||||
xkb_model = get_prop_string(hal_ctx, udi, "input.xkb.model");
|
||||
xkb_layout = get_prop_string(hal_ctx, udi, "input.xkb.layout");
|
||||
xkb_variant = get_prop_string(hal_ctx, udi, "input.xkb.variant");
|
||||
xkb_options = get_prop_string_array(hal_ctx, udi, "input.xkb.options");
|
||||
options = xcalloc(sizeof(*options), 1);
|
||||
if (!options){
|
||||
LogMessage(X_ERROR, "config/hal: couldn't allocate space for input options!\n");
|
||||
goto unwind;
|
||||
}
|
||||
|
||||
options = xcalloc(sizeof(*options), 1);
|
||||
options->key = xstrdup("_source");
|
||||
options->value = xstrdup("server/hal");
|
||||
if (!options->key || !options->value) {
|
||||
ErrorF("[config] couldn't allocate first key/value pair\n");
|
||||
LogMessage(X_ERROR, "config/hal: couldn't allocate first key/value pair\n");
|
||||
goto unwind;
|
||||
}
|
||||
|
||||
/* most drivers use device.. not path. evdev uses both however, but the
|
||||
* path version isn't documented apparently. support both for now. */
|
||||
add_option(&options, "path", path);
|
||||
add_option(&options, "device", path);
|
||||
|
||||
add_option(&options, "driver", driver);
|
||||
add_option(&options, "name", name);
|
||||
|
||||
config_info = xalloc(strlen(udi) + 5); /* "hal:" and NULL */
|
||||
if (!config_info)
|
||||
if (!config_info) {
|
||||
LogMessage(X_ERROR, "config/hal: couldn't allocate name\n");
|
||||
goto unwind;
|
||||
}
|
||||
sprintf(config_info, "hal:%s", udi);
|
||||
|
||||
if (xkb_rules)
|
||||
add_option(&options, "xkb_rules", xkb_rules);
|
||||
if (xkb_model)
|
||||
add_option(&options, "xkb_model", xkb_model);
|
||||
if (xkb_layout)
|
||||
add_option(&options, "xkb_layout", xkb_layout);
|
||||
if (xkb_variant)
|
||||
add_option(&options, "xkb_variant", xkb_variant);
|
||||
if (xkb_options)
|
||||
add_option(&options, "xkb_options", xkb_options);
|
||||
/* ok, grab options from hal.. iterate through all properties
|
||||
* and lets see if any of them are options that we can add */
|
||||
set = libhal_device_get_all_properties(hal_ctx, udi, &error);
|
||||
|
||||
DebugF("[config/hal] Adding device %s\n", name);
|
||||
if (!set) {
|
||||
LogMessage(X_ERROR, "config/hal: couldn't get property list for %s: %s (%s)\n",
|
||||
udi, error.name, error.message);
|
||||
goto unwind;
|
||||
}
|
||||
|
||||
libhal_psi_init(&set_iter,set);
|
||||
while (libhal_psi_has_more(&set_iter)) {
|
||||
/* we are looking for supported keys.. extract and add to options */
|
||||
psi_key = libhal_psi_get_key(&set_iter);
|
||||
|
||||
if (psi_key){
|
||||
|
||||
/* normal options first (input.x11_options.<propname>) */
|
||||
if (!strncasecmp(psi_key, LIBHAL_PROP_KEY, sizeof(LIBHAL_PROP_KEY)-1)){
|
||||
|
||||
/* only support strings for all values */
|
||||
tmp_val = get_prop_string(hal_ctx, udi, psi_key);
|
||||
|
||||
if (tmp_val){
|
||||
char* tmp;
|
||||
|
||||
/* xkb needs special handling. HAL specs include
|
||||
* input.xkb.xyz options, but the x11-input.fdi specifies
|
||||
* input.x11_options.Xkbxyz options. By default, we use
|
||||
* the former, unless the specific X11 ones are specified.
|
||||
* Since we can't predict the order in which the keys
|
||||
* arrive, we need to store them.
|
||||
*/
|
||||
#ifndef HAVE_STRCASESTR
|
||||
int psi_key_len = strlen(psi_key);
|
||||
char *lower_psi_key = xalloc(psi_key_len + 1);
|
||||
|
||||
CopyISOLatin1Lowered((unsigned char *) lower_psi_key,
|
||||
(unsigned char *) psi_key,
|
||||
psi_key_len);
|
||||
if ((tmp = strstr(lower_psi_key, "xkb")))
|
||||
#else
|
||||
if ((tmp = strcasestr(psi_key, "xkb")))
|
||||
#endif
|
||||
{
|
||||
if (!strcasecmp(&tmp[3], "layout"))
|
||||
{
|
||||
if (xkb_opts.layout)
|
||||
xfree(xkb_opts.layout);
|
||||
xkb_opts.layout = strdup(tmp_val);
|
||||
} else if (!strcasecmp(&tmp[3], "model"))
|
||||
{
|
||||
if (xkb_opts.model)
|
||||
xfree(xkb_opts.model);
|
||||
xkb_opts.model = strdup(tmp_val);
|
||||
} else if (!strcasecmp(&tmp[3], "rules"))
|
||||
{
|
||||
if (xkb_opts.rules)
|
||||
xfree(xkb_opts.rules);
|
||||
xkb_opts.rules = strdup(tmp_val);
|
||||
} else if (!strcasecmp(&tmp[3], "variant"))
|
||||
{
|
||||
if (xkb_opts.variant)
|
||||
xfree(xkb_opts.variant);
|
||||
xkb_opts.variant = strdup(tmp_val);
|
||||
}
|
||||
} else
|
||||
{
|
||||
/* all others */
|
||||
add_option(&options, psi_key + sizeof(LIBHAL_PROP_KEY)-1, tmp_val);
|
||||
xfree(tmp_val);
|
||||
}
|
||||
#ifndef HAVE_STRCASESTR
|
||||
xfree(lower_psi_key);
|
||||
#endif
|
||||
}
|
||||
} else if (!strncasecmp(psi_key, LIBHAL_XKB_PROP_KEY, sizeof(LIBHAL_XKB_PROP_KEY)-1)){
|
||||
|
||||
/* only support strings for all values */
|
||||
tmp_val = get_prop_string(hal_ctx, udi, psi_key);
|
||||
|
||||
if (tmp_val){
|
||||
char* tmp;
|
||||
|
||||
tmp = &psi_key[sizeof(LIBHAL_XKB_PROP_KEY) - 1];
|
||||
|
||||
if (!strcasecmp(tmp, "layout"))
|
||||
{
|
||||
if (!xkb_opts.layout)
|
||||
xkb_opts.layout = strdup(tmp_val);
|
||||
} else if (!strcasecmp(tmp, "rules"))
|
||||
{
|
||||
if (!xkb_opts.rules)
|
||||
xkb_opts.rules = strdup(tmp_val);
|
||||
} else if (!strcasecmp(tmp, "variant"))
|
||||
{
|
||||
if (!xkb_opts.variant)
|
||||
xkb_opts.variant = strdup(tmp_val);
|
||||
} else if (!strcasecmp(tmp, "model"))
|
||||
{
|
||||
if (!xkb_opts.model)
|
||||
xkb_opts.model = strdup(tmp_val);
|
||||
}
|
||||
xfree(tmp_val);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* psi_key doesn't need to be freed */
|
||||
libhal_psi_next(&set_iter);
|
||||
}
|
||||
|
||||
|
||||
/* Now add xkb options */
|
||||
if (xkb_opts.layout)
|
||||
add_option(&options, "xkb_layout", xkb_opts.layout);
|
||||
if (xkb_opts.rules)
|
||||
add_option(&options, "xkb_rules", xkb_opts.rules);
|
||||
if (xkb_opts.variant)
|
||||
add_option(&options, "xkb_variant", xkb_opts.variant);
|
||||
if (xkb_opts.model)
|
||||
add_option(&options, "xkb_model", xkb_opts.model);
|
||||
|
||||
/* this isn't an error, but how else do you output something that the user can see? */
|
||||
LogMessage(X_INFO, "config/hal: Adding input device %s\n", name);
|
||||
if (NewInputDeviceRequest(options, &dev) != Success) {
|
||||
ErrorF("[config/hal] NewInputDeviceRequest failed\n");
|
||||
LogMessage(X_ERROR, "config/hal: NewInputDeviceRequest failed\n");
|
||||
dev = NULL;
|
||||
goto unwind;
|
||||
}
|
||||
|
||||
for (; dev; dev = dev->next)
|
||||
for (; dev; dev = dev->next){
|
||||
if (dev->config_info)
|
||||
xfree(dev->config_info);
|
||||
dev->config_info = xstrdup(config_info);
|
||||
}
|
||||
|
||||
unwind:
|
||||
if (set)
|
||||
libhal_free_property_set(set);
|
||||
if (path)
|
||||
xfree(path);
|
||||
if (driver)
|
||||
xfree(driver);
|
||||
if (name)
|
||||
xfree(name);
|
||||
if (xkb_rules)
|
||||
xfree(xkb_rules);
|
||||
if (xkb_model)
|
||||
xfree(xkb_model);
|
||||
if (xkb_layout)
|
||||
xfree(xkb_layout);
|
||||
if (xkb_variant)
|
||||
xfree(xkb_variant);
|
||||
if (xkb_options)
|
||||
xfree(xkb_options);
|
||||
if (config_info)
|
||||
xfree(config_info);
|
||||
while (!dev && (tmpo = options)) {
|
||||
|
|
@ -272,7 +384,15 @@ unwind:
|
|||
xfree(tmpo);
|
||||
}
|
||||
|
||||
out_error:
|
||||
if (xkb_opts.layout)
|
||||
xfree(xkb_opts.layout);
|
||||
if (xkb_opts.rules)
|
||||
xfree(xkb_opts.rules);
|
||||
if (xkb_opts.model)
|
||||
xfree(xkb_opts.model);
|
||||
if (xkb_opts.variant)
|
||||
xfree(xkb_opts.variant);
|
||||
|
||||
dbus_error_free(&error);
|
||||
|
||||
return;
|
||||
|
|
@ -288,7 +408,7 @@ disconnect_hook(void *data)
|
|||
if (dbus_connection_get_is_connected(info->system_bus)) {
|
||||
dbus_error_init(&error);
|
||||
if (!libhal_ctx_shutdown(info->hal_ctx, &error))
|
||||
DebugF("[config/hal] couldn't shut down context: %s (%s)\n",
|
||||
LogMessage(X_WARNING, "config/hal: disconnect_hook couldn't shut down context: %s (%s)\n",
|
||||
error.name, error.message);
|
||||
dbus_error_free(&error);
|
||||
}
|
||||
|
|
@ -314,21 +434,21 @@ connect_hook(DBusConnection *connection, void *data)
|
|||
if (!info->hal_ctx)
|
||||
info->hal_ctx = libhal_ctx_new();
|
||||
if (!info->hal_ctx) {
|
||||
ErrorF("[config/hal] couldn't create HAL context\n");
|
||||
LogMessage(X_ERROR, "config/hal: couldn't create HAL context\n");
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
if (!libhal_ctx_set_dbus_connection(info->hal_ctx, info->system_bus)) {
|
||||
ErrorF("[config/hal] couldn't associate HAL context with bus\n");
|
||||
LogMessage(X_ERROR, "config/hal: couldn't associate HAL context with bus\n");
|
||||
goto out_ctx;
|
||||
}
|
||||
if (!libhal_ctx_init(info->hal_ctx, &error)) {
|
||||
ErrorF("[config/hal] couldn't initialise context: %s (%s)\n",
|
||||
LogMessage(X_ERROR, "config/hal: couldn't initialise context: %s (%s)\n",
|
||||
error.name, error.message);
|
||||
goto out_ctx;
|
||||
}
|
||||
if (!libhal_device_property_watch_all(info->hal_ctx, &error)) {
|
||||
ErrorF("[config/hal] couldn't watch all properties: %s (%s)\n",
|
||||
LogMessage(X_ERROR, "config/hal: couldn't watch all properties: %s (%s)\n",
|
||||
error.name, error.message);
|
||||
goto out_ctx2;
|
||||
}
|
||||
|
|
@ -348,7 +468,7 @@ connect_hook(DBusConnection *connection, void *data)
|
|||
|
||||
out_ctx2:
|
||||
if (!libhal_ctx_shutdown(info->hal_ctx, &error))
|
||||
DebugF("[config/hal] couldn't shut down context: %s (%s)\n",
|
||||
LogMessage(X_WARNING, "config/hal: couldn't shut down context: %s (%s)\n",
|
||||
error.name, error.message);
|
||||
out_ctx:
|
||||
libhal_ctx_free(info->hal_ctx);
|
||||
|
|
@ -376,10 +496,13 @@ config_hal_init(void)
|
|||
hal_info.hal_ctx = NULL;
|
||||
|
||||
if (!config_dbus_core_add_hook(&hook)) {
|
||||
ErrorF("[config/hal] failed to add D-Bus hook\n");
|
||||
LogMessage(X_ERROR, "config/hal: failed to add D-Bus hook\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* verbose message */
|
||||
LogMessageVerb(X_INFO,7,"config/hal: initialized");
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,57 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<deviceinfo version="0.2">
|
||||
<device>
|
||||
<!-- FIXME: Support tablets too. -->
|
||||
|
||||
<!-- The way this works:
|
||||
|
||||
Match against some input device (see the HAL specification for more
|
||||
information), and then merge in keys, which you can use to specify
|
||||
the configuration similar to the way you would in xorg.conf. You will
|
||||
need to restart HAL after making changes. If you are having issues,
|
||||
starting X with the -logverbose 7 flag may yield useful information.
|
||||
|
||||
Keys Supported:
|
||||
|
||||
Key "input.x11_driver" (string)
|
||||
This specifies the driver to use. You MUST specify this option,
|
||||
or a driver will not be loaded and the rest will be ignored by
|
||||
Xorg
|
||||
|
||||
Key "input.x11_options.<option name>" (string)
|
||||
This allows you to specify arbitrary options to pass to the driver.
|
||||
Anything you would normally specify in xorg.conf goes here. So, for
|
||||
option "Mode" in xorg.conf, you would specify the key name of
|
||||
"input.x11_options.Mode".
|
||||
|
||||
Do not specify "input.x11_options.Device" since "input.device"
|
||||
will be used automatically.
|
||||
|
||||
Legacy Keys
|
||||
"input.xkb.rules"
|
||||
"input.xkb.model"
|
||||
"input.xkb.layout"
|
||||
"input.xkb.variant"
|
||||
"input.xkb.options"
|
||||
|
||||
These keys are deprecated. Use these instead:
|
||||
"input.x11_options.XkbRules"
|
||||
"input.x11_options.XkbModel"
|
||||
"input.x11_options.XkbLayout"
|
||||
"input.x11_options.XkbVariant"
|
||||
"input.x11_options.XkbOptions"
|
||||
|
||||
See the evdev documentation for more information.
|
||||
|
||||
You will probably want to add the following option to the ServerFlags of
|
||||
your xorg.conf:
|
||||
|
||||
Option "AllowEmptyInput" "True"
|
||||
|
||||
FIXME: Support tablets too.
|
||||
TODO: I think its fixed, can't test
|
||||
|
||||
-->
|
||||
|
||||
<match key="info.capabilities" contains="input.mouse">
|
||||
<merge key="input.x11_driver" type="string">mouse</merge>
|
||||
<match key="/org/freedesktop/Hal/devices/computer:system.kernel.name"
|
||||
|
|
@ -11,21 +61,21 @@
|
|||
</match>
|
||||
|
||||
<match key="info.capabilities" contains="input.keys">
|
||||
<merge key="input.xkb.rules" type="string">base</merge>
|
||||
<merge key="input.x11_options.XkbRules" type="string">base</merge>
|
||||
|
||||
<!-- If we're using Linux, we use evdev by default (falling back to
|
||||
keyboard otherwise). -->
|
||||
<merge key="input.x11_driver" type="string">keyboard</merge>
|
||||
<merge key="input.xkb.model" type="string">pc105</merge>
|
||||
<merge key="input.x11_options.XkbModel" type="string">pc105</merge>
|
||||
<match key="/org/freedesktop/Hal/devices/computer:system.kernel.name"
|
||||
string="Linux">
|
||||
<merge key="input.x11_driver" type="string">evdev</merge>
|
||||
<merge key="input.xkb.model" type="string">evdev</merge>
|
||||
<merge key="input.x11_options.XkbModel" type="string">evdev</merge>
|
||||
</match>
|
||||
|
||||
<merge key="input.xkb.layout" type="string">us</merge>
|
||||
<merge key="input.x11_options.XkbLayout" type="string">us</merge>
|
||||
|
||||
<merge key="input.xkb.variant" type="string" />
|
||||
<merge key="input.x11_options.XkbVariant" type="string" />
|
||||
</match>
|
||||
</device>
|
||||
</deviceinfo>
|
||||
|
|
|
|||
|
|
@ -190,7 +190,7 @@ dnl Checks for library functions.
|
|||
AC_FUNC_VPRINTF
|
||||
AC_CHECK_FUNCS([geteuid getuid link memmove memset mkstemp strchr strrchr \
|
||||
strtol getopt getopt_long vsnprintf walkcontext backtrace \
|
||||
getisax getzoneid shmctl64])
|
||||
getisax getzoneid shmctl64 strcasestr])
|
||||
AC_FUNC_ALLOCA
|
||||
dnl Old HAS_* names used in os/*.c.
|
||||
AC_CHECK_FUNC([getdtablesize],
|
||||
|
|
@ -583,7 +583,7 @@ AC_ARG_ENABLE(xfake, AS_HELP_STRING([--enable-xfake], [Build the kdrive
|
|||
AC_ARG_ENABLE(xfbdev, AS_HELP_STRING([--enable-xfbdev], [Build the kdrive framebuffer device server (default: auto)]), [XFBDEV=$enableval], [XFBDEV=auto])
|
||||
AC_ARG_ENABLE(kdrive-vesa, AS_HELP_STRING([--enable-kdrive-vesa], [Build the kdrive VESA-based servers (default: auto)]), [KDRIVEVESA=$enableval], [KDRIVEVESA=auto])
|
||||
dnl xprint
|
||||
AC_ARG_ENABLE(freetype, AS_HELP_STRING([ --enable-freetype], [Build Xprint FreeType backend (default: yes)]), [XP_USE_FREETYPE=$enableval],[XP_USE_FREETYPE=no])
|
||||
AC_ARG_ENABLE(freetype, AS_HELP_STRING([ --enable-freetype], [Build Xprint FreeType backend (default: no)]), [XP_USE_FREETYPE=$enableval],[XP_USE_FREETYPE=no])
|
||||
AC_ARG_WITH(freetype-config, AS_HELP_STRING([ --with-freetype-config=PROG], [Use FreeType configuration program PROG (default: auto)]), freetype_config=$withval, freetype_config=auto)
|
||||
|
||||
|
||||
|
|
@ -1058,6 +1058,8 @@ XKB_STUB_LIB='$(top_builddir)/xkb/libxkbstubs.la'
|
|||
|
||||
AC_CHECK_FUNC(strcasecmp, [], AC_DEFINE([NEED_STRCASECMP], 1,
|
||||
[Do not have 'strcasecmp'.]))
|
||||
AC_CHECK_FUNC(strncasecmp, [], AC_DEFINE([NEED_STRNCASECMP], 1,
|
||||
[Do not have 'strncasecmp'.]))
|
||||
|
||||
if test "x$NULL_ROOT_CURSOR" = xyes; then
|
||||
AC_DEFINE(NULL_ROOT_CURSOR, 1, [Use an empty root cursor])
|
||||
|
|
@ -1386,8 +1388,6 @@ if test "x$XORG" = xyes -o "x$XGL" = xyes; then
|
|||
;;
|
||||
alpha*)
|
||||
linux_alpha=yes
|
||||
XORG_OS_PCI="axp"
|
||||
xorg_bus_linuxpci="no"
|
||||
;;
|
||||
i*86|amd64*|x86_64*)
|
||||
linux_acpi="yes"
|
||||
|
|
|
|||
53
dbe/dbe.c
53
dbe/dbe.c
|
|
@ -229,6 +229,7 @@ ProcDbeAllocateBackBufferName(ClientPtr client)
|
|||
xDbeSwapAction swapAction;
|
||||
VisualID visual;
|
||||
int status;
|
||||
int add_index;
|
||||
|
||||
|
||||
REQUEST_SIZE_MATCH(xDbeAllocateBackBufferNameReq);
|
||||
|
|
@ -299,14 +300,6 @@ ProcDbeAllocateBackBufferName(ClientPtr client)
|
|||
return(BadAlloc);
|
||||
bzero(pDbeWindowPriv, sizeof(DbeWindowPrivRec));
|
||||
|
||||
/* Make the window priv a DBE window priv resource. */
|
||||
if (!AddResource(stuff->buffer, dbeWindowPrivResType,
|
||||
(pointer)pDbeWindowPriv))
|
||||
{
|
||||
xfree(pDbeWindowPriv);
|
||||
return(BadAlloc);
|
||||
}
|
||||
|
||||
/* Fill out window priv information. */
|
||||
pDbeWindowPriv->pWindow = pWin;
|
||||
pDbeWindowPriv->width = pWin->drawable.width;
|
||||
|
|
@ -321,14 +314,15 @@ ProcDbeAllocateBackBufferName(ClientPtr client)
|
|||
/* Initialize the buffer ID list. */
|
||||
pDbeWindowPriv->maxAvailableIDs = DBE_INIT_MAX_IDS;
|
||||
pDbeWindowPriv->IDs[0] = stuff->buffer;
|
||||
for (i = 1; i < DBE_INIT_MAX_IDS; i++)
|
||||
|
||||
add_index = 0;
|
||||
for (i = 0; i < DBE_INIT_MAX_IDS; i++)
|
||||
{
|
||||
pDbeWindowPriv->IDs[i] = DBE_FREE_ID_ELEMENT;
|
||||
}
|
||||
|
||||
|
||||
/* Actually connect the window priv to the window. */
|
||||
dixSetPrivate(&pWin->devPrivates, dbeWindowPrivKey, pDbeWindowPriv);
|
||||
dixSetPrivate(&pWin->devPrivates, dbeWindowPrivKey, pDbeWindowPriv);
|
||||
|
||||
} /* if -- There is no buffer associated with the window. */
|
||||
|
||||
|
|
@ -354,7 +348,6 @@ ProcDbeAllocateBackBufferName(ClientPtr client)
|
|||
/* No more room in the ID array -- reallocate another array. */
|
||||
XID *pIDs;
|
||||
|
||||
|
||||
/* Setup an array pointer for the realloc operation below. */
|
||||
if (pDbeWindowPriv->maxAvailableIDs == DBE_INIT_MAX_IDS)
|
||||
{
|
||||
|
|
@ -391,16 +384,7 @@ ProcDbeAllocateBackBufferName(ClientPtr client)
|
|||
pDbeWindowPriv->maxAvailableIDs += DBE_INCR_MAX_IDS;
|
||||
}
|
||||
|
||||
/* Finally, record the buffer ID in the array. */
|
||||
pDbeWindowPriv->IDs[i] = stuff->buffer;
|
||||
|
||||
/* Associate the new ID with an existing window priv. */
|
||||
if (!AddResource(stuff->buffer, dbeWindowPrivResType,
|
||||
(pointer)pDbeWindowPriv))
|
||||
{
|
||||
pDbeWindowPriv->IDs[i] = DBE_FREE_ID_ELEMENT;
|
||||
return(BadAlloc);
|
||||
}
|
||||
add_index = i;
|
||||
|
||||
} /* else -- A buffer is already associated with the window. */
|
||||
|
||||
|
|
@ -409,13 +393,26 @@ ProcDbeAllocateBackBufferName(ClientPtr client)
|
|||
status = (*pDbeScreenPriv->AllocBackBufferName)(pWin, stuff->buffer,
|
||||
stuff->swapAction);
|
||||
|
||||
if ((status != Success) && (pDbeWindowPriv->nBufferIDs == 0))
|
||||
if (status == Success)
|
||||
{
|
||||
pDbeWindowPriv->IDs[add_index] = stuff->buffer;
|
||||
if (!AddResource(stuff->buffer, dbeWindowPrivResType,
|
||||
(pointer)pDbeWindowPriv))
|
||||
{
|
||||
pDbeWindowPriv->IDs[add_index] = DBE_FREE_ID_ELEMENT;
|
||||
|
||||
if (pDbeWindowPriv->nBufferIDs == 0) {
|
||||
status = BadAlloc;
|
||||
goto out_free;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* The DDX buffer allocation routine failed for the first buffer of
|
||||
* this window.
|
||||
*/
|
||||
xfree(pDbeWindowPriv);
|
||||
return(status);
|
||||
if (pDbeWindowPriv->nBufferIDs == 0) {
|
||||
goto out_free;
|
||||
}
|
||||
}
|
||||
|
||||
/* Increment the number of buffers (XIDs) associated with this window. */
|
||||
|
|
@ -424,9 +421,13 @@ ProcDbeAllocateBackBufferName(ClientPtr client)
|
|||
/* Set swap action on all calls. */
|
||||
pDbeWindowPriv->swapAction = stuff->swapAction;
|
||||
|
||||
|
||||
return(status);
|
||||
|
||||
out_free:
|
||||
dixSetPrivate(&pWin->devPrivates, dbeWindowPrivKey, NULL);
|
||||
xfree(pDbeWindowPriv);
|
||||
return (status);
|
||||
|
||||
} /* ProcDbeAllocateBackBufferName() */
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -39,6 +39,12 @@ from The Open Group.
|
|||
#include "colormapst.h"
|
||||
#include "inputstr.h"
|
||||
|
||||
struct _Private {
|
||||
DevPrivateKey key;
|
||||
pointer value;
|
||||
struct _Private *next;
|
||||
};
|
||||
|
||||
typedef struct _PrivateDesc {
|
||||
DevPrivateKey key;
|
||||
unsigned size;
|
||||
|
|
@ -116,6 +122,65 @@ dixAllocatePrivate(PrivateRec **privates, const DevPrivateKey key)
|
|||
return &ptr->value;
|
||||
}
|
||||
|
||||
/*
|
||||
* Look up a private pointer.
|
||||
*/
|
||||
_X_EXPORT pointer
|
||||
dixLookupPrivate(PrivateRec **privates, const DevPrivateKey key)
|
||||
{
|
||||
PrivateRec *rec = *privates;
|
||||
pointer *ptr;
|
||||
|
||||
while (rec) {
|
||||
if (rec->key == key)
|
||||
return rec->value;
|
||||
rec = rec->next;
|
||||
}
|
||||
|
||||
ptr = dixAllocatePrivate(privates, key);
|
||||
return ptr ? *ptr : NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Look up the address of a private pointer.
|
||||
*/
|
||||
_X_EXPORT pointer *
|
||||
dixLookupPrivateAddr(PrivateRec **privates, const DevPrivateKey key)
|
||||
{
|
||||
PrivateRec *rec = *privates;
|
||||
|
||||
while (rec) {
|
||||
if (rec->key == key)
|
||||
return &rec->value;
|
||||
rec = rec->next;
|
||||
}
|
||||
|
||||
return dixAllocatePrivate(privates, key);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set a private pointer.
|
||||
*/
|
||||
_X_EXPORT int
|
||||
dixSetPrivate(PrivateRec **privates, const DevPrivateKey key, pointer val)
|
||||
{
|
||||
PrivateRec *rec;
|
||||
|
||||
top:
|
||||
rec = *privates;
|
||||
while (rec) {
|
||||
if (rec->key == key) {
|
||||
rec->value = val;
|
||||
return TRUE;
|
||||
}
|
||||
rec = rec->next;
|
||||
}
|
||||
|
||||
if (!dixAllocatePrivate(privates, key))
|
||||
return FALSE;
|
||||
goto top;
|
||||
}
|
||||
|
||||
/*
|
||||
* Called to free privates at object deletion time.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -359,16 +359,28 @@ V000 SECURITY:AuthorizationRevoked
|
|||
E000 SECURITY:BadAuthorization
|
||||
E001 SECURITY:BadAuthorizationProtocol
|
||||
R000 SELinux:SELinuxQueryVersion
|
||||
R001 SELinux:SELinuxSetSelectionManager
|
||||
R002 SELinux:SELinuxGetSelectionManager
|
||||
R001 SELinux:SELinuxSetDeviceCreateContext
|
||||
R002 SELinux:SELinuxGetDeviceCreateContext
|
||||
R003 SELinux:SELinuxSetDeviceContext
|
||||
R004 SELinux:SELinuxGetDeviceContext
|
||||
R005 SELinux:SELinuxSetPropertyCreateContext
|
||||
R006 SELinux:SELinuxGetPropertyCreateContext
|
||||
R007 SELinux:SELinuxGetPropertyContext
|
||||
R008 SELinux:SELinuxSetWindowCreateContext
|
||||
R009 SELinux:SELinuxGetWindowCreateContext
|
||||
R010 SELinux:SELinuxGetWindowContext
|
||||
R005 SELinux:SELinuxSetWindowCreateContext
|
||||
R006 SELinux:SELinuxGetWindowCreateContext
|
||||
R007 SELinux:SELinuxGetWindowContext
|
||||
R008 SELinux:SELinuxSetPropertyCreateContext
|
||||
R009 SELinux:SELinuxGetPropertyCreateContext
|
||||
R010 SELinux:SELinuxSetPropertyUseContext
|
||||
R011 SELinux:SELinuxGetPropertyUseContext
|
||||
R012 SELinux:SELinuxGetPropertyContext
|
||||
R013 SELinux:SELinuxGetPropertyDataContext
|
||||
R014 SELinux:SELinuxListProperties
|
||||
R015 SELinux:SELinuxSetSelectionCreateContext
|
||||
R016 SELinux:SELinuxGetSelectionCreateContext
|
||||
R017 SELinux:SELinuxSetSelectionUseContext
|
||||
R018 SELinux:SELinuxGetSelectionUseContext
|
||||
R019 SELinux:SELinuxGetSelectionContext
|
||||
R020 SELinux:SELinuxGetSelectionDataContext
|
||||
R021 SELinux:SELinuxListSelections
|
||||
R022 SELinux:SELinuxGetClientContext
|
||||
R000 SHAPE:QueryVersion
|
||||
R001 SHAPE:Rectangles
|
||||
R002 SHAPE:Mask
|
||||
|
|
|
|||
10
fb/fb24_32.c
10
fb/fb24_32.c
|
|
@ -1,5 +1,4 @@
|
|||
/*
|
||||
*
|
||||
* Copyright © 2000 SuSE, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||
|
|
@ -544,11 +543,10 @@ fb24_32ReformatTile(PixmapPtr pOldTile, int bitsPerPixel)
|
|||
int oldXoff, oldYoff;
|
||||
int newXoff, newYoff;
|
||||
|
||||
pNewTile = fbCreatePixmapBpp (pScreen,
|
||||
pOldTile->drawable.width,
|
||||
pOldTile->drawable.height,
|
||||
pOldTile->drawable.depth,
|
||||
bitsPerPixel, 0);
|
||||
pNewTile = pScreen->CreatePixmap(pScreen, pOldTile->drawable.width,
|
||||
pOldTile->drawable.height,
|
||||
pOldTile->drawable.depth,
|
||||
pOldTile->usage_hint);
|
||||
if (!pNewTile)
|
||||
return 0;
|
||||
fbGetDrawable (&pOldTile->drawable,
|
||||
|
|
|
|||
|
|
@ -1004,8 +1004,7 @@ static int MakeCurrent(__GLXclientState *cl,
|
|||
prevglxc->pGlxPixmap = 0;
|
||||
}
|
||||
|
||||
if (prevglxc->pGlxReadPixmap &&
|
||||
prevglxc->pGlxReadPixmap != prevglxc->pGlxPixmap ) {
|
||||
if (prevglxc->pGlxReadPixmap) {
|
||||
/*
|
||||
** The previous drawable was a glx pixmap, release it.
|
||||
*/
|
||||
|
|
@ -1023,8 +1022,7 @@ static int MakeCurrent(__GLXclientState *cl,
|
|||
prevglxc->pGlxWindow = 0;
|
||||
}
|
||||
|
||||
if (prevglxc->pGlxReadWindow &&
|
||||
prevglxc->pGlxReadWindow != prevglxc->pGlxWindow) {
|
||||
if (prevglxc->pGlxReadWindow) {
|
||||
/*
|
||||
** The previous drawable was a glx window, release it.
|
||||
*/
|
||||
|
|
@ -1042,8 +1040,7 @@ static int MakeCurrent(__GLXclientState *cl,
|
|||
prevglxc->pGlxPbuffer = 0;
|
||||
}
|
||||
|
||||
if (prevglxc->pGlxReadPbuffer &&
|
||||
prevglxc->pGlxReadPbuffer != prevglxc->pGlxPbuffer ) {
|
||||
if (prevglxc->pGlxReadPbuffer) {
|
||||
/*
|
||||
** The previous drawable was a glx Pbuffer, release it.
|
||||
*/
|
||||
|
|
@ -1071,7 +1068,7 @@ static int MakeCurrent(__GLXclientState *cl,
|
|||
pGlxPixmap->refcnt++;
|
||||
}
|
||||
|
||||
if (pReadGlxPixmap && pReadGlxPixmap != pGlxPixmap) {
|
||||
if (pReadGlxPixmap) {
|
||||
pReadGlxPixmap->refcnt++;
|
||||
}
|
||||
|
||||
|
|
@ -1079,7 +1076,7 @@ static int MakeCurrent(__GLXclientState *cl,
|
|||
pGlxWindow->refcnt++;
|
||||
}
|
||||
|
||||
if (pGlxReadWindow && pGlxReadWindow != pGlxWindow) {
|
||||
if (pGlxReadWindow) {
|
||||
pGlxReadWindow->refcnt++;
|
||||
}
|
||||
|
||||
|
|
@ -1087,7 +1084,7 @@ static int MakeCurrent(__GLXclientState *cl,
|
|||
pGlxPbuffer->refcnt++;
|
||||
}
|
||||
|
||||
if (pGlxReadPbuffer && pGlxReadPbuffer != pGlxPbuffer) {
|
||||
if (pGlxReadPbuffer) {
|
||||
pGlxReadPbuffer->refcnt++;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -7,18 +7,12 @@
|
|||
# 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
|
||||
|
||||
# 1152x768 @ 54.8Hz (Titanium PowerBook) hsync: 44.2kHz
|
||||
ModeLine "1152x768" 64.995 1152 1178 1314 1472 768 771 777 806 +hsync +vsync
|
||||
|
||||
# 1400x1050 @ 60Hz (VESA GTF) hsync: 65.5kHz
|
||||
ModeLine "1400x1050" 122.0 1400 1488 1640 1880 1050 1052 1064 1082 +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
|
||||
|
||||
# 1920x1440 @ 85Hz (VESA GTF) hsync: 128.5kHz
|
||||
Modeline "1920x1440" 341.35 1920 2072 2288 2656 1440 1441 1444 1512 -hsync +vsync
|
||||
|
||||
|
|
|
|||
|
|
@ -265,6 +265,9 @@ _X_HIDDEN void *dixLookupTab[] = {
|
|||
SYMFUNC(dixRegisterPrivateInitFunc)
|
||||
SYMFUNC(dixRegisterPrivateDeleteFunc)
|
||||
SYMFUNC(dixAllocatePrivate)
|
||||
SYMFUNC(dixLookupPrivate)
|
||||
SYMFUNC(dixLookupPrivateAddr)
|
||||
SYMFUNC(dixSetPrivate)
|
||||
SYMFUNC(dixFreePrivates)
|
||||
SYMFUNC(dixRegisterPrivateOffset)
|
||||
SYMFUNC(dixLookupPrivateOffset)
|
||||
|
|
|
|||
|
|
@ -1683,6 +1683,7 @@ SetCompatOutput(xf86CrtcConfigPtr config)
|
|||
return output;
|
||||
}
|
||||
|
||||
_X_EXPORT void
|
||||
xf86SetScrnInfoModes (ScrnInfoPtr scrn)
|
||||
{
|
||||
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
|
||||
|
|
@ -1854,6 +1855,7 @@ bestModeForAspect(xf86CrtcConfigPtr config, Bool *enabled, float aspect)
|
|||
|
||||
nextEnabledOutput(config, enabled, &o);
|
||||
while ((mode = nextAspectMode(config->output[o], mode, aspect))) {
|
||||
test = mode;
|
||||
for (p = o; nextEnabledOutput(config, enabled, &p); ) {
|
||||
test = xf86OutputFindClosestMode(config->output[p], mode);
|
||||
if (!test)
|
||||
|
|
|
|||
|
|
@ -159,7 +159,7 @@ xf86OpenConsole()
|
|||
xf86ConsOpen_t *driver;
|
||||
#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
|
||||
int result;
|
||||
#ifdef __FreeBSD__
|
||||
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
struct utsname uts;
|
||||
#endif
|
||||
vtmode_t vtmode;
|
||||
|
|
|
|||
|
|
@ -23,10 +23,6 @@ if XORG_BUS_SPARCPCI
|
|||
PCI_SOURCES += sparcPci.c
|
||||
endif
|
||||
|
||||
if LINUX_ALPHA
|
||||
PCI_SOURCES += axpPci.c
|
||||
endif
|
||||
|
||||
if XORG_BUS_SPARC
|
||||
PLATFORM_SOURCES = Sbus.c
|
||||
sdk_HEADERS += xf86Sbus.h
|
||||
|
|
|
|||
|
|
@ -189,69 +189,26 @@
|
|||
#define ARCH_PCI_INIT bsdPciInit
|
||||
#endif
|
||||
|
||||
#if defined(linux)
|
||||
# define ARCH_PCI_INIT linuxPciInit
|
||||
# if defined(__m32r__)
|
||||
# define INCLUDE_XF86_MAP_PCI_MEM
|
||||
# define INCLUDE_XF86_NO_DOMAIN
|
||||
# endif
|
||||
#endif /* defined(linux) */
|
||||
|
||||
|
||||
#if !defined(ARCH_PCI_INIT)
|
||||
/*
|
||||
* Select architecture specific PCI init function
|
||||
*/
|
||||
#if defined(__alpha__)
|
||||
# if defined(linux)
|
||||
# define ARCH_PCI_INIT axpPciInit
|
||||
# endif
|
||||
#elif defined(__arm__)
|
||||
# if defined(linux)
|
||||
# define ARCH_PCI_INIT linuxPciInit
|
||||
# endif
|
||||
#elif defined(__hppa__)
|
||||
# if defined(linux)
|
||||
# define ARCH_PCI_INIT linuxPciInit
|
||||
# endif
|
||||
#elif defined(__ia64__)
|
||||
# if defined(linux)
|
||||
# define ARCH_PCI_INIT linuxPciInit
|
||||
# endif
|
||||
#elif defined(__i386__) || defined(__i386)
|
||||
# if defined(linux)
|
||||
# define ARCH_PCI_INIT linuxPciInit
|
||||
# else
|
||||
# define ARCH_PCI_INIT ix86PciInit
|
||||
# endif
|
||||
#elif defined(__mc68000__)
|
||||
# if defined(linux)
|
||||
# define ARCH_PCI_INIT linuxPciInit
|
||||
# endif
|
||||
#elif defined(__mips__)
|
||||
# if defined(linux)
|
||||
# define ARCH_PCI_INIT linuxPciInit
|
||||
# endif
|
||||
#if defined(__i386__) || defined(__i386) || defined(__amd64__) || defined(__amd64) || defined(__x86_64__)
|
||||
# define ARCH_PCI_INIT ix86PciInit
|
||||
#elif defined(__powerpc__) || defined(__powerpc64__)
|
||||
# if defined(linux)
|
||||
# define ARCH_PCI_INIT linuxPciInit
|
||||
# else
|
||||
# define ARCH_PCI_INIT ppcPciInit
|
||||
# endif
|
||||
#elif defined(__s390__)
|
||||
# if defined(linux)
|
||||
# define ARCH_PCI_INIT linuxPciInit
|
||||
# endif
|
||||
#elif defined(__sh__)
|
||||
# if defined(linux)
|
||||
# define ARCH_PCI_INIT linuxPciInit
|
||||
# endif
|
||||
# define ARCH_PCI_INIT ppcPciInit
|
||||
#elif defined(__sparc__) || defined(sparc)
|
||||
# if defined(linux)
|
||||
# define ARCH_PCI_INIT linuxPciInit
|
||||
# elif defined(sun)
|
||||
# define ARCH_PCI_INIT sparcPciInit
|
||||
# endif
|
||||
# if !defined(__FreeBSD__) && !defined(linux)
|
||||
# define ARCH_PCI_PCI_BRIDGE sparcPciPciBridge
|
||||
# endif
|
||||
#elif defined(__amd64__) || defined(__amd64) || defined(__x86_64__)
|
||||
# if defined(linux)
|
||||
# define ARCH_PCI_INIT linuxPciInit
|
||||
# else
|
||||
# define ARCH_PCI_INIT ix86PciInit
|
||||
# endif
|
||||
# define ARCH_PCI_INIT sparcPciInit
|
||||
# define ARCH_PCI_PCI_BRIDGE sparcPciPciBridge
|
||||
#endif
|
||||
#endif /* !defined(ARCH_PCI_INIT) */
|
||||
|
||||
|
|
|
|||
|
|
@ -1,415 +0,0 @@
|
|||
/*
|
||||
* Copyright 1998 by Concurrent Computer Corporation
|
||||
*
|
||||
* 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 Concurrent Computer
|
||||
* Corporation not be used in advertising or publicity pertaining to
|
||||
* distribution of the software without specific, written prior
|
||||
* permission. Concurrent Computer Corporation makes no representations
|
||||
* about the suitability of this software for any purpose. It is
|
||||
* provided "as is" without express or implied warranty.
|
||||
*
|
||||
* CONCURRENT COMPUTER CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD
|
||||
* TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
* AND FITNESS, IN NO EVENT SHALL CONCURRENT COMPUTER CORPORATION 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.
|
||||
*
|
||||
* Copyright 1998 by Metro Link Incorporated
|
||||
*
|
||||
* 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 Metro Link
|
||||
* Incorporated not be used in advertising or publicity pertaining to
|
||||
* distribution of the software without specific, written prior
|
||||
* permission. Metro Link Incorporated makes no representations
|
||||
* about the suitability of this software for any purpose. It is
|
||||
* provided "as is" without express or implied warranty.
|
||||
*
|
||||
* METRO LINK INCORPORATED DISCLAIMS ALL WARRANTIES WITH REGARD
|
||||
* TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
* AND FITNESS, IN NO EVENT SHALL METRO LINK INCORPORATED 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.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_XORG_CONFIG_H
|
||||
#include <xorg-config.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include "compiler.h"
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
#include "Pci.h"
|
||||
|
||||
#include <asm/unistd.h>
|
||||
#include "../linux/lnx.h" /* for _iobase */
|
||||
|
||||
/*
|
||||
* Alpha/Linux platform specific PCI access functions
|
||||
*/
|
||||
static CARD32 axpPciCfgRead(PCITAG tag, int off);
|
||||
static void axpPciCfgWrite(PCITAG, int off, CARD32 val);
|
||||
static void axpPciCfgSetBits(PCITAG tag, int off, CARD32 mask, CARD32 bits);
|
||||
|
||||
static pciBusFuncs_t axpFuncs0 = {
|
||||
/* pciReadLong */ axpPciCfgRead,
|
||||
/* pciWriteLong */ axpPciCfgWrite,
|
||||
/* pciSetBitsLong */ axpPciCfgSetBits,
|
||||
/* pciAddrHostToBus */ pciAddrNOOP,
|
||||
/* pciAddrBusToHost */ pciAddrNOOP
|
||||
};
|
||||
|
||||
typedef struct _axpDomainRec {
|
||||
int domain, hose;
|
||||
int root_bus;
|
||||
unsigned long dense_io, sparse_io;
|
||||
unsigned long dense_mem, sparse_mem;
|
||||
IOADDRESS mapped_io;
|
||||
} axpDomainRec, *axpDomainPtr;
|
||||
|
||||
#define MAX_DOMAINS (MAX_PCI_BUSES / 256)
|
||||
static axpDomainPtr xf86DomainInfo[MAX_DOMAINS] = { NULL, };
|
||||
static int pciNumDomains = 0;
|
||||
|
||||
/*
|
||||
* For debug, domain assignment can start downward from a fixed base
|
||||
* (instead of up from 0) by defining FORCE_HIGH_DOMAINS. This allows
|
||||
* debug of large domain numbers and sparse domain numbering on systems
|
||||
* which don't have as many hoses.
|
||||
*/
|
||||
#if 0
|
||||
# define FORCE_HIGH_DOMAINS MAX_DOMAINS /* assign domains downward from here */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If FORCE_HIGH_DOMAINS is set, make sure it's not larger than the
|
||||
* max domain
|
||||
*/
|
||||
#if defined(FORCE_HIGH_DOMAINS) && (FORCE_HIGH_DOMAINS > MAX_DOMAINS)
|
||||
# undef FORCE_HIGH_DOMAINS
|
||||
# define FORCE_HIGH_DOMAINS MAX_DOMAINS
|
||||
#endif
|
||||
|
||||
static int
|
||||
axpSetupDomains(void)
|
||||
{
|
||||
axpDomainRec axpDomain;
|
||||
int numDomains = 0;
|
||||
int hose;
|
||||
|
||||
#ifndef INCLUDE_XF86_NO_DOMAIN
|
||||
|
||||
#ifdef FORCE_HIGH_DOMAINS
|
||||
xf86Msg(X_WARNING,
|
||||
"DEBUG OPTION FORCE_HIGH_DOMAINS in use - DRI will *NOT* work\n");
|
||||
numDomains = FORCE_HIGH_DOMAINS;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Since each hose has a different address space, hoses are a perfect
|
||||
* overlay for domains, so set up one domain for each hose present
|
||||
* in the system. We have to loop through all possible hoses because
|
||||
* some systems allow sparse I/O controllers.
|
||||
*/
|
||||
for(hose = 0; hose < MAX_DOMAINS; hose++) {
|
||||
axpDomain.root_bus = _iobase(IOBASE_ROOT_BUS, hose, -1, -1);
|
||||
if (axpDomain.root_bus < 0) continue;
|
||||
|
||||
axpDomain.hose = hose;
|
||||
|
||||
#ifndef FORCE_HIGH_DOMAINS
|
||||
|
||||
axpDomain.domain = axpDomain.hose = hose;
|
||||
numDomains = axpDomain.domain + 1;
|
||||
|
||||
#else /* FORCE_HIGH_DOMAINS */
|
||||
|
||||
axpDomain.domain = numDomains - hose - 1;
|
||||
|
||||
xf86Msg(X_WARNING,
|
||||
"FORCE_HIGH_DOMAINS - assigned hose %d to domain %d\n",
|
||||
axpDomain.hose, axpDomain.domain);
|
||||
|
||||
#endif /* FORCE_HIGH_DOMAINS */
|
||||
|
||||
axpDomain.dense_io = _iobase(IOBASE_DENSE_IO, hose, -1, -1);
|
||||
axpDomain.sparse_io = _iobase(IOBASE_SPARSE_IO, hose, -1, -1);
|
||||
axpDomain.mapped_io = 0;
|
||||
axpDomain.dense_mem = _iobase(IOBASE_DENSE_MEM, hose, -1, -1);
|
||||
axpDomain.sparse_mem = _iobase(IOBASE_SPARSE_MEM, hose, -1, -1);
|
||||
|
||||
xf86DomainInfo[axpDomain.domain] = xnfalloc(sizeof(axpDomainRec));
|
||||
*(xf86DomainInfo[axpDomain.domain]) = axpDomain;
|
||||
|
||||
/*
|
||||
* For now, only allow a single domain (hose) on sparse i/o systems.
|
||||
*
|
||||
* Allowing multiple domains on sparse systems would require:
|
||||
* 1) either
|
||||
* a) revamping the sparse video mapping code to allow
|
||||
* for multiple unrelated address regions
|
||||
* -- OR --
|
||||
* b) implementing sparse mapping directly in
|
||||
* xf86MapDomainMemory
|
||||
* 2) revaming read/write sparse routines to correctly handle
|
||||
* the solution to 1)
|
||||
* 3) implementing a sparse I/O system (mapping, inX/outX)
|
||||
* independent of glibc, since the glibc version only
|
||||
* supports hose 0
|
||||
*/
|
||||
if (axpDomain.sparse_io) {
|
||||
if (_iobase(IOBASE_ROOT_BUS, hose + 1, -1, -1) >= 0) {
|
||||
/*
|
||||
* It's a sparse i/o system with (at least) one more hose,
|
||||
* show a message indicating that video is constrained to
|
||||
* hose 0
|
||||
*/
|
||||
xf86Msg(X_INFO,
|
||||
"Sparse I/O system - constraining video to hose 0\n");
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#else /* INCLUDE_XF86_NO_DOMAIN */
|
||||
|
||||
/*
|
||||
* domain support is not included, so just set up a single domain (0)
|
||||
* to represent the first hose so that axpPciInit will still have
|
||||
* be able to set up the root bus
|
||||
*/
|
||||
xf86DomainInfo[0] = xnfalloc(sizeof(axpDomainRec));
|
||||
*(xf86DomainInfo[0]) = axpDomain;
|
||||
numDomains = 1;
|
||||
|
||||
#endif /* INCLUDE_XF86_NO_DOMAIN */
|
||||
|
||||
return numDomains;
|
||||
}
|
||||
|
||||
void
|
||||
axpPciInit()
|
||||
{
|
||||
axpDomainPtr pDomain;
|
||||
int domain, bus;
|
||||
|
||||
pciNumDomains = axpSetupDomains();
|
||||
|
||||
for(domain = 0; domain < pciNumDomains; domain++) {
|
||||
if (!(pDomain = xf86DomainInfo[domain])) continue;
|
||||
|
||||
/*
|
||||
* Since any bridged buses will be behind a probed pci-pci bridge,
|
||||
* only set up the root bus for each domain (hose) and the bridged
|
||||
* buses will be set up as they are found.
|
||||
*/
|
||||
/* make a bus with both the domain and the root bus in it */
|
||||
bus = PCI_MAKE_BUS(domain, pDomain->root_bus);
|
||||
pciBusInfo[bus] = xnfalloc(sizeof(pciBusInfo_t));
|
||||
(void)memset(pciBusInfo[bus], 0, sizeof(pciBusInfo_t));
|
||||
|
||||
pciBusInfo[bus]->configMech = PCI_CFG_MECH_OTHER;
|
||||
pciBusInfo[bus]->numDevices = 32;
|
||||
pciBusInfo[bus]->funcs = &axpFuncs0;
|
||||
pciBusInfo[bus]->pciBusPriv = pDomain;
|
||||
|
||||
pciNumBuses = bus + 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Alpha/Linux PCI configuration space access routines
|
||||
*/
|
||||
static int
|
||||
axpPciBusFromTag(PCITAG tag)
|
||||
{
|
||||
pciBusInfo_t *pBusInfo;
|
||||
axpDomainPtr pDomain;
|
||||
int bus, dfn;
|
||||
|
||||
bus = PCI_BUS_FROM_TAG(tag);
|
||||
if ((bus >= pciNumBuses)
|
||||
|| !(pBusInfo = pciBusInfo[bus])
|
||||
|| !(pDomain = pBusInfo->pciBusPriv)
|
||||
|| (pDomain->domain != PCI_DOM_FROM_TAG(tag))) return -1;
|
||||
|
||||
bus = PCI_BUS_NO_DOMAIN(bus); /* should just be root_bus */
|
||||
dfn = PCI_DFN_FROM_TAG(tag);
|
||||
if (_iobase(IOBASE_HOSE, -1, bus, dfn) != pDomain->hose) return -1;
|
||||
|
||||
return bus;
|
||||
}
|
||||
|
||||
static CARD32
|
||||
axpPciCfgRead(PCITAG tag, int off)
|
||||
{
|
||||
int bus, dfn;
|
||||
CARD32 val = 0xffffffff;
|
||||
|
||||
if ((bus = axpPciBusFromTag(tag)) >= 0) {
|
||||
dfn = PCI_DFN_FROM_TAG(tag);
|
||||
|
||||
syscall(__NR_pciconfig_read, bus, dfn, off, 4, &val);
|
||||
}
|
||||
return(val);
|
||||
}
|
||||
|
||||
static void
|
||||
axpPciCfgWrite(PCITAG tag, int off, CARD32 val)
|
||||
{
|
||||
int bus, dfn;
|
||||
|
||||
if ((bus = axpPciBusFromTag(tag)) >= 0) {
|
||||
dfn = PCI_DFN_FROM_TAG(tag);
|
||||
syscall(__NR_pciconfig_write, bus, dfn, off, 4, &val);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
axpPciCfgSetBits(PCITAG tag, int off, CARD32 mask, CARD32 bits)
|
||||
{
|
||||
int bus, dfn;
|
||||
CARD32 val = 0xffffffff;
|
||||
|
||||
if ((bus = axpPciBusFromTag(tag)) >= 0) {
|
||||
dfn = PCI_DFN_FROM_TAG(tag);
|
||||
|
||||
syscall(__NR_pciconfig_read, bus, dfn, off, 4, &val);
|
||||
val = (val & ~mask) | (bits & mask);
|
||||
syscall(__NR_pciconfig_write, bus, dfn, off, 4, &val);
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef INCLUDE_XF86_NO_DOMAIN
|
||||
|
||||
/*
|
||||
* Alpha/Linux addressing domain support
|
||||
*/
|
||||
|
||||
_X_EXPORT int
|
||||
xf86GetPciDomain(PCITAG Tag)
|
||||
{
|
||||
return PCI_DOM_FROM_TAG(Tag);
|
||||
}
|
||||
|
||||
_X_EXPORT pointer
|
||||
xf86MapDomainMemory(int ScreenNum, int Flags, PCITAG Tag,
|
||||
ADDRESS Base, unsigned long Size)
|
||||
{
|
||||
axpDomainPtr pDomain;
|
||||
int domain = PCI_DOM_FROM_TAG(Tag);
|
||||
|
||||
if ((domain < 0) || (domain >= pciNumDomains) ||
|
||||
!(pDomain = xf86DomainInfo[domain]))
|
||||
FatalError("%s called with invalid parameters\n", __FUNCTION__);
|
||||
|
||||
/*
|
||||
* xf86MapVidMem already does what we need, but remember to subtract
|
||||
* _bus_base() (the physical dense memory root of hose 0) since
|
||||
* xf86MapVidMem is expecting an offset relative to _bus_base() rather
|
||||
* than an actual physical address.
|
||||
*/
|
||||
return xf86MapVidMem(ScreenNum, Flags,
|
||||
pDomain->dense_mem + Base - _bus_base(), Size);
|
||||
}
|
||||
|
||||
IOADDRESS
|
||||
xf86MapLegacyIO(struct pci_device *dev)
|
||||
{
|
||||
axpDomainPtr pDomain;
|
||||
const int domain = dev->domain;
|
||||
|
||||
if ((domain < 0) || (domain >= pciNumDomains) ||
|
||||
!(pDomain = xf86DomainInfo[domain]))
|
||||
FatalError("%s called with invalid parameters\n", __FUNCTION__);
|
||||
|
||||
/*
|
||||
* Use glibc inx/outx routines for sparse I/O, so just return the
|
||||
* base [this is ok since we also constrain sparse I/O systems to
|
||||
* a single domain in axpSetupDomains()]
|
||||
*/
|
||||
if (pDomain->sparse_io) return 0;
|
||||
|
||||
/*
|
||||
* I/O addresses on Alpha are really just different physical memory
|
||||
* addresses that the system corelogic turns into I/O commands on the
|
||||
* bus, so just use xf86MapVidMem to map I/O as well, but remember
|
||||
* to subtract _bus_base() (the physical dense memory root of hose 0)
|
||||
* since xf86MapVidMem is expecting an offset relative to _bus_base()
|
||||
* rather than an actual physical address.
|
||||
*
|
||||
* Map the entire I/O space (64kB) at once and only once.
|
||||
*/
|
||||
if (!pDomain->mapped_io)
|
||||
pDomain->mapped_io = (IOADDRESS)xf86MapVidMem(-1, VIDMEM_MMIO,
|
||||
pDomain->dense_io - _bus_base(),
|
||||
0x10000);
|
||||
|
||||
return pDomain->mapped_io;
|
||||
}
|
||||
|
||||
resPtr
|
||||
xf86AccResFromOS(resPtr pRes)
|
||||
{
|
||||
resRange range;
|
||||
int domain;
|
||||
|
||||
for(domain = 0; domain < pciNumDomains; domain++) {
|
||||
if (!xf86DomainInfo[domain]) continue;
|
||||
|
||||
/*
|
||||
* Fallback is to claim the following areas:
|
||||
*
|
||||
* 0x000c0000 - 0x000effff location of VGA and other extensions ROMS
|
||||
*/
|
||||
|
||||
RANGE(range, 0x000c0000, 0x000effff,
|
||||
RANGE_TYPE(ResExcMemBlock, domain));
|
||||
pRes = xf86AddResToList(pRes, &range, -1);
|
||||
|
||||
/*
|
||||
* Fallback would be to claim well known ports in the 0x0 - 0x3ff
|
||||
* range along with their sparse I/O aliases, but that's too
|
||||
* imprecise. Instead claim a bare minimum here.
|
||||
*/
|
||||
RANGE(range, 0x00000000, 0x000000ff,
|
||||
RANGE_TYPE(ResExcIoBlock, domain)); /* For mainboard */
|
||||
pRes = xf86AddResToList(pRes, &range, -1);
|
||||
|
||||
/*
|
||||
* At minimum, the top and bottom resources must be claimed, so that
|
||||
* resources that are (or appear to be) unallocated can be relocated.
|
||||
*/
|
||||
RANGE(range, 0x00000000, 0x00000000,
|
||||
RANGE_TYPE(ResExcMemBlock, domain));
|
||||
pRes = xf86AddResToList(pRes, &range, -1);
|
||||
RANGE(range, 0xffffffff, 0xffffffff,
|
||||
RANGE_TYPE(ResExcMemBlock, domain));
|
||||
pRes = xf86AddResToList(pRes, &range, -1);
|
||||
/* RANGE(range, 0x00000000, 0x00000000,
|
||||
RANGE_TYPE(ResExcIoBlock, domain));
|
||||
pRes = xf86AddResToList(pRes, &range, -1); */
|
||||
RANGE(range, 0xffffffff, 0xffffffff,
|
||||
RANGE_TYPE(ResExcIoBlock, domain));
|
||||
pRes = xf86AddResToList(pRes, &range, -1);
|
||||
}
|
||||
|
||||
return pRes;
|
||||
}
|
||||
|
||||
#endif /* !INCLUDE_XF86_NO_DOMAIN */
|
||||
|
||||
|
|
@ -101,6 +101,7 @@ xf86SIGIO (int sig)
|
|||
int i;
|
||||
fd_set ready;
|
||||
struct timeval to;
|
||||
int save_errno = errno; /* do not clobber the global errno */
|
||||
int r;
|
||||
|
||||
ready = xf86SigIOMask;
|
||||
|
|
@ -117,6 +118,8 @@ xf86SIGIO (int sig)
|
|||
if (r > 0) {
|
||||
xf86Msg(X_ERROR, "SIGIO %d descriptors not handled\n", r);
|
||||
}
|
||||
/* restore global errno */
|
||||
errno = save_errno;
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
|||
|
|
@ -40,6 +40,12 @@
|
|||
|
||||
#include "x86emu/x86emui.h"
|
||||
|
||||
#undef bswap_32
|
||||
#define bswap_32(x) (((x & 0xff000000) >> 24) | \
|
||||
((x & 0x00ff0000) >> 8) | \
|
||||
((x & 0x0000ff00) << 8) | \
|
||||
((x & 0x000000ff) << 24))
|
||||
|
||||
/*----------------------------- Implementation ----------------------------*/
|
||||
|
||||
/****************************************************************************
|
||||
|
|
@ -2571,6 +2577,47 @@ static void x86emuOp2_movsx_word_R_RM(u8 X86EMU_UNUSED(op2))
|
|||
END_OF_INSTR();
|
||||
}
|
||||
|
||||
/* Handles opcodes 0xc8-0xcf */
|
||||
static void x86emuOp2_bswap(u8 X86EMU_UNUSED(op2))
|
||||
{
|
||||
START_OF_INSTR();
|
||||
DECODE_PRINTF("BSWAP\n");
|
||||
TRACE_AND_STEP();
|
||||
|
||||
switch (op2) {
|
||||
case 0xc8:
|
||||
M.x86.R_EAX = bswap_32(M.x86.R_EAX);
|
||||
break;
|
||||
case 0xc9:
|
||||
M.x86.R_ECX = bswap_32(M.x86.R_ECX);
|
||||
break;
|
||||
case 0xca:
|
||||
M.x86.R_EDX = bswap_32(M.x86.R_EDX);
|
||||
break;
|
||||
case 0xcb:
|
||||
M.x86.R_EBX = bswap_32(M.x86.R_EBX);
|
||||
break;
|
||||
case 0xcc:
|
||||
M.x86.R_ESP = bswap_32(M.x86.R_ESP);
|
||||
break;
|
||||
case 0xcd:
|
||||
M.x86.R_EBP = bswap_32(M.x86.R_EBP);
|
||||
break;
|
||||
case 0xce:
|
||||
M.x86.R_ESI = bswap_32(M.x86.R_ESI);
|
||||
break;
|
||||
case 0xcf:
|
||||
M.x86.R_EDI = bswap_32(M.x86.R_EDI);
|
||||
break;
|
||||
default:
|
||||
/* can't happen */
|
||||
break;
|
||||
}
|
||||
|
||||
DECODE_CLEAR_SEGOVR();
|
||||
END_OF_INSTR();
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
* Double byte operation code table:
|
||||
**************************************************************************/
|
||||
|
|
@ -2788,14 +2835,14 @@ void (*x86emu_optab2[256])(u8) =
|
|||
/* 0xc5 */ x86emuOp2_illegal_op,
|
||||
/* 0xc6 */ x86emuOp2_illegal_op,
|
||||
/* 0xc7 */ x86emuOp2_illegal_op,
|
||||
/* 0xc8 */ x86emuOp2_illegal_op, /* TODO: bswap */
|
||||
/* 0xc9 */ x86emuOp2_illegal_op, /* TODO: bswap */
|
||||
/* 0xca */ x86emuOp2_illegal_op, /* TODO: bswap */
|
||||
/* 0xcb */ x86emuOp2_illegal_op, /* TODO: bswap */
|
||||
/* 0xcc */ x86emuOp2_illegal_op, /* TODO: bswap */
|
||||
/* 0xcd */ x86emuOp2_illegal_op, /* TODO: bswap */
|
||||
/* 0xce */ x86emuOp2_illegal_op, /* TODO: bswap */
|
||||
/* 0xcf */ x86emuOp2_illegal_op, /* TODO: bswap */
|
||||
/* 0xc8 */ x86emuOp2_bswap,
|
||||
/* 0xc9 */ x86emuOp2_bswap,
|
||||
/* 0xca */ x86emuOp2_bswap,
|
||||
/* 0xcb */ x86emuOp2_bswap,
|
||||
/* 0xcc */ x86emuOp2_bswap,
|
||||
/* 0xcd */ x86emuOp2_bswap,
|
||||
/* 0xce */ x86emuOp2_bswap,
|
||||
/* 0xcf */ x86emuOp2_bswap,
|
||||
|
||||
/* 0xd0 */ x86emuOp2_illegal_op,
|
||||
/* 0xd1 */ x86emuOp2_illegal_op,
|
||||
|
|
|
|||
|
|
@ -9,7 +9,9 @@ MSB_3_FIXED = mf3-xaaBitmap.c mf3-xaaStipple.c
|
|||
POLYSEG = s-xaaLine.c s-xaaDashLine.c
|
||||
|
||||
libxaa_la_LDFLAGS = -avoid-version
|
||||
if COMPOSITE
|
||||
libxaa_la_LIBADD = $(top_builddir)/miext/cw/libcw.la
|
||||
endif
|
||||
|
||||
module_LTLIBRARIES = libxaa.la
|
||||
libxaa_la_SOURCES = xaaInit.c xaaGC.c xaaInitAccel.c xaaFallback.c \
|
||||
|
|
|
|||
|
|
@ -43,7 +43,8 @@ typedef enum {
|
|||
XAAOPT_WRITE_BITMAP,
|
||||
XAAOPT_WRITE_PIXMAP,
|
||||
XAAOPT_PIXMAP_CACHE,
|
||||
XAAOPT_OFFSCREEN_PIXMAPS
|
||||
XAAOPT_OFFSCREEN_PIXMAPS,
|
||||
XAAOPT_HAS_DUMB_INVERTED_OPTION_SENSE
|
||||
} XAAOpts;
|
||||
|
||||
static const OptionInfoRec XAAOptions[] = {
|
||||
|
|
@ -89,6 +90,8 @@ static const OptionInfoRec XAAOptions[] = {
|
|||
OPTV_BOOLEAN, {0}, FALSE },
|
||||
{XAAOPT_OFFSCREEN_PIXMAPS, "XaaNoOffscreenPixmaps",
|
||||
OPTV_BOOLEAN, {0}, FALSE },
|
||||
{XAAOPT_HAS_DUMB_INVERTED_OPTION_SENSE, "XaaOffscreenPixmaps",
|
||||
OPTV_BOOLEAN, {0}, FALSE },
|
||||
{ -1, NULL,
|
||||
OPTV_NONE, {0}, FALSE }
|
||||
};
|
||||
|
|
@ -532,8 +535,8 @@ XAAInitAccel(ScreenPtr pScreen, XAAInfoRecPtr infoRec)
|
|||
#define XAAMSG(s) do { if (serverGeneration == 1) xf86ErrorF(s); } while (0)
|
||||
|
||||
if((infoRec->Flags & OFFSCREEN_PIXMAPS) && HaveScreenToScreenCopy &&
|
||||
!xf86ReturnOptValBool(options, XAAOPT_OFFSCREEN_PIXMAPS,
|
||||
FALSE)) {
|
||||
xf86IsOptionSet(options, XAAOPT_HAS_DUMB_INVERTED_OPTION_SENSE))
|
||||
{
|
||||
XAAMSG("\tOffscreen Pixmaps\n");
|
||||
} else {
|
||||
infoRec->Flags &= ~OFFSCREEN_PIXMAPS;
|
||||
|
|
|
|||
|
|
@ -199,6 +199,9 @@
|
|||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#undef HAVE_STDLIB_H
|
||||
|
||||
/* Define to 1 if you have the `strcasestr' function. */
|
||||
#undef HAVE_STRCASESTR
|
||||
|
||||
/* Define to 1 if you have the `strchr' function. */
|
||||
#undef HAVE_STRCHR
|
||||
|
||||
|
|
|
|||
|
|
@ -20,12 +20,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
*****************************************************************/
|
||||
|
||||
typedef void *DevPrivateKey;
|
||||
|
||||
typedef struct _Private {
|
||||
DevPrivateKey key;
|
||||
pointer value;
|
||||
struct _Private *next;
|
||||
} PrivateRec;
|
||||
struct _Private;
|
||||
typedef struct _Private PrivateRec;
|
||||
|
||||
/*
|
||||
* Request pre-allocated private space for your driver/module.
|
||||
|
|
@ -43,61 +39,20 @@ dixAllocatePrivate(PrivateRec **privates, const DevPrivateKey key);
|
|||
/*
|
||||
* Look up a private pointer.
|
||||
*/
|
||||
static _X_INLINE pointer
|
||||
dixLookupPrivate(PrivateRec **privates, const DevPrivateKey key)
|
||||
{
|
||||
PrivateRec *rec = *privates;
|
||||
pointer *ptr;
|
||||
|
||||
while (rec) {
|
||||
if (rec->key == key)
|
||||
return rec->value;
|
||||
rec = rec->next;
|
||||
}
|
||||
|
||||
ptr = dixAllocatePrivate(privates, key);
|
||||
return ptr ? *ptr : NULL;
|
||||
}
|
||||
pointer
|
||||
dixLookupPrivate(PrivateRec **privates, const DevPrivateKey key);
|
||||
|
||||
/*
|
||||
* Look up the address of a private pointer.
|
||||
*/
|
||||
static _X_INLINE pointer *
|
||||
dixLookupPrivateAddr(PrivateRec **privates, const DevPrivateKey key)
|
||||
{
|
||||
PrivateRec *rec = *privates;
|
||||
|
||||
while (rec) {
|
||||
if (rec->key == key)
|
||||
return &rec->value;
|
||||
rec = rec->next;
|
||||
}
|
||||
|
||||
return dixAllocatePrivate(privates, key);
|
||||
}
|
||||
pointer *
|
||||
dixLookupPrivateAddr(PrivateRec **privates, const DevPrivateKey key);
|
||||
|
||||
/*
|
||||
* Set a private pointer.
|
||||
*/
|
||||
static _X_INLINE int
|
||||
dixSetPrivate(PrivateRec **privates, const DevPrivateKey key, pointer val)
|
||||
{
|
||||
PrivateRec *rec;
|
||||
|
||||
top:
|
||||
rec = *privates;
|
||||
while (rec) {
|
||||
if (rec->key == key) {
|
||||
rec->value = val;
|
||||
return TRUE;
|
||||
}
|
||||
rec = rec->next;
|
||||
}
|
||||
|
||||
if (!dixAllocatePrivate(privates, key))
|
||||
return FALSE;
|
||||
goto top;
|
||||
}
|
||||
int
|
||||
dixSetPrivate(PrivateRec **privates, const DevPrivateKey key, pointer val);
|
||||
|
||||
/*
|
||||
* Register callbacks to be called on private allocation/freeing.
|
||||
|
|
|
|||
|
|
@ -2657,7 +2657,7 @@ SProcRecordQueryVersion(ClientPtr client)
|
|||
} /* SProcRecordQueryVersion */
|
||||
|
||||
|
||||
static void
|
||||
static int
|
||||
SwapCreateRegister(xRecordRegisterClientsReq *stuff)
|
||||
{
|
||||
register char n;
|
||||
|
|
@ -2668,11 +2668,17 @@ SwapCreateRegister(xRecordRegisterClientsReq *stuff)
|
|||
swapl(&stuff->nClients, n);
|
||||
swapl(&stuff->nRanges, n);
|
||||
pClientID = (XID *)&stuff[1];
|
||||
if (stuff->nClients > stuff->length - (sz_xRecordRegisterClientsReq >> 2))
|
||||
return BadLength;
|
||||
for (i = 0; i < stuff->nClients; i++, pClientID++)
|
||||
{
|
||||
swapl(pClientID, n);
|
||||
}
|
||||
if (stuff->nRanges > stuff->length - (sz_xRecordRegisterClientsReq >> 2)
|
||||
- stuff->nClients)
|
||||
return BadLength;
|
||||
RecordSwapRanges((xRecordRange *)pClientID, stuff->nRanges);
|
||||
return Success;
|
||||
} /* SwapCreateRegister */
|
||||
|
||||
|
||||
|
|
@ -2680,11 +2686,13 @@ static int
|
|||
SProcRecordCreateContext(ClientPtr client)
|
||||
{
|
||||
REQUEST(xRecordCreateContextReq);
|
||||
int status;
|
||||
register char n;
|
||||
|
||||
swaps(&stuff->length, n);
|
||||
REQUEST_AT_LEAST_SIZE(xRecordCreateContextReq);
|
||||
SwapCreateRegister((pointer)stuff);
|
||||
if ((status = SwapCreateRegister((pointer)stuff)) != Success)
|
||||
return status;
|
||||
return ProcRecordCreateContext(client);
|
||||
} /* SProcRecordCreateContext */
|
||||
|
||||
|
|
@ -2693,11 +2701,13 @@ static int
|
|||
SProcRecordRegisterClients(ClientPtr client)
|
||||
{
|
||||
REQUEST(xRecordRegisterClientsReq);
|
||||
int status;
|
||||
register char n;
|
||||
|
||||
swaps(&stuff->length, n);
|
||||
REQUEST_AT_LEAST_SIZE(xRecordRegisterClientsReq);
|
||||
SwapCreateRegister((pointer)stuff);
|
||||
if ((status = SwapCreateRegister((pointer)stuff)) != Success)
|
||||
return status;
|
||||
return ProcRecordRegisterClients(client);
|
||||
} /* SProcRecordRegisterClients */
|
||||
|
||||
|
|
|
|||
|
|
@ -1117,9 +1117,16 @@ ProcRenderAddGlyphs (ClientPtr client)
|
|||
remain -= (sizeof (CARD32) + sizeof (xGlyphInfo)) * nglyphs;
|
||||
for (i = 0; i < nglyphs; i++)
|
||||
{
|
||||
size_t padded_width;
|
||||
glyph_new = &glyphs[i];
|
||||
size = gi[i].height * PixmapBytePad (gi[i].width,
|
||||
glyphSet->format->depth);
|
||||
|
||||
padded_width = PixmapBytePad (gi[i].width,
|
||||
glyphSet->format->depth);
|
||||
|
||||
if (gi[i].height && padded_width > (UINT32_MAX - sizeof(GlyphRec))/gi[i].height)
|
||||
break;
|
||||
|
||||
size = gi[i].height * padded_width;
|
||||
if (remain < size)
|
||||
break;
|
||||
|
||||
|
|
@ -1562,6 +1569,8 @@ ProcRenderCreateCursor (ClientPtr client)
|
|||
pScreen = pSrc->pDrawable->pScreen;
|
||||
width = pSrc->pDrawable->width;
|
||||
height = pSrc->pDrawable->height;
|
||||
if (height && width > UINT32_MAX/(height*sizeof(CARD32)))
|
||||
return BadAlloc;
|
||||
if ( stuff->x > width
|
||||
|| stuff->y > height )
|
||||
return (BadMatch);
|
||||
|
|
@ -1987,6 +1996,8 @@ static int ProcRenderCreateLinearGradient (ClientPtr client)
|
|||
LEGAL_NEW_RESOURCE(stuff->pid, client);
|
||||
|
||||
len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq);
|
||||
if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
|
||||
return BadLength;
|
||||
if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
|
||||
return BadLength;
|
||||
|
||||
|
|
@ -2575,18 +2586,18 @@ SProcRenderCreateSolidFill(ClientPtr client)
|
|||
return (*ProcRenderVector[stuff->renderReqType]) (client);
|
||||
}
|
||||
|
||||
static void swapStops(void *stuff, int n)
|
||||
static void swapStops(void *stuff, int num)
|
||||
{
|
||||
int i;
|
||||
int i, n;
|
||||
CARD32 *stops;
|
||||
CARD16 *colors;
|
||||
stops = (CARD32 *)(stuff);
|
||||
for (i = 0; i < n; ++i) {
|
||||
for (i = 0; i < num; ++i) {
|
||||
swapl(stops, n);
|
||||
++stops;
|
||||
}
|
||||
colors = (CARD16 *)(stops);
|
||||
for (i = 0; i < 4*n; ++i) {
|
||||
for (i = 0; i < 4*num; ++i) {
|
||||
swaps(stops, n);
|
||||
++stops;
|
||||
}
|
||||
|
|
@ -2609,6 +2620,8 @@ SProcRenderCreateLinearGradient (ClientPtr client)
|
|||
swapl(&stuff->nStops, n);
|
||||
|
||||
len = (client->req_len << 2) - sizeof(xRenderCreateLinearGradientReq);
|
||||
if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
|
||||
return BadLength;
|
||||
if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
|
||||
return BadLength;
|
||||
|
||||
|
|
@ -2636,6 +2649,8 @@ SProcRenderCreateRadialGradient (ClientPtr client)
|
|||
swapl(&stuff->nStops, n);
|
||||
|
||||
len = (client->req_len << 2) - sizeof(xRenderCreateRadialGradientReq);
|
||||
if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
|
||||
return BadLength;
|
||||
if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
|
||||
return BadLength;
|
||||
|
||||
|
|
@ -2660,6 +2675,8 @@ SProcRenderCreateConicalGradient (ClientPtr client)
|
|||
swapl(&stuff->nStops, n);
|
||||
|
||||
len = (client->req_len << 2) - sizeof(xRenderCreateConicalGradientReq);
|
||||
if (stuff->nStops > UINT32_MAX/(sizeof(xFixed) + sizeof(xRenderColor)))
|
||||
return BadLength;
|
||||
if (len != stuff->nStops*(sizeof(xFixed) + sizeof(xRenderColor)))
|
||||
return BadLength;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue