Compare commits

...

12 Commits

Author SHA1 Message Date
Enrico Weigelt, metux IT consult f0ce8bc0ea xfree86: parser: fix possible use-after-free xf86freeOutputClassList()
Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-05-09 21:07:36 +02:00
Enrico Weigelt, metux IT consult 54c43f56ce xfree86: dri: extra safety checks for NULL pointers / disabled extension
Be more cautious on possible NULL pointers or not yet registered
devPrivates. Better a gracefully fail instead of hard segfault.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-05-09 21:07:36 +02:00
Enrico Weigelt, metux IT consult e2ce9be0e9 xfree86: ddc: safety check for NULL pointer
Even though it *should* never be actually hit, it's still safer
to check for NULL instead of letting us crash with segfault.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-05-09 21:07:36 +02:00
Enrico Weigelt, metux IT consult d27a3b5af6 xfree86: common: extra safety checks for NULL pointers
Even though it's unlikely ever getting it, still safer to have some
extra checks / asserts than unexpected segfault.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-05-09 21:07:36 +02:00
Enrico Weigelt, metux IT consult e557625730 xfree86: common: fix not-found check in xf86platformAddDevice()
Safer (and easier to understand) if we look at the result pointer
instead of the counter for testing whether device wasn't found.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-05-09 21:07:36 +02:00
Enrico Weigelt, metux IT consult f1111921a7 xfree86: common: gracefully handle allocation failure
Better try to handle memory allocation gracefully than just hard
crashing by segfault.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-05-09 21:07:36 +02:00
Enrico Weigelt, metux IT consult 0b9e86bf9e xfree86: utils: gracefully handle allocation failure.
Better failing gracefully instead of hard crash via segfault.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-05-09 21:07:36 +02:00
Enrico Weigelt, metux IT consult 67e8f54a60 xfree86: int10: extra NULL protection
Even though chances are really low it's ever getting hit, it's still safer
to have some sanity checks (which don't cost us much) than risking segfault.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-05-09 21:07:36 +02:00
Enrico Weigelt, metux IT consult cd143176fc xfree86: modes: fix uninitialized variables
| ../hw/xfree86/modes/xf86RandR12.c: In function ‘xf86ComputeCrtcPan’:
| ../hw/xfree86/modes/xf86RandR12.c:310:54: warning: use of uninitialized value ‘r[1]’ [CWE-457] [-Wanalyzer-use-of-uninitialized-value]
|   310 |             q[i] = m->m[1][i] * r[0] - m->m[0][i] * r[1];
|       |                                                     ~^~~

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-05-09 21:07:36 +02:00
Enrico Weigelt, metux IT consult 0a09d17cee xfree86: loader: add assert() in LoadModule()
There's (remote) chance that the (internal) module name could become
NULL (eg. allocation failure). Even though chances to hit it are very
low, it's still better to have a check here (that doesn't cost us much),
just in case. Assert fail is still better than segfault, since we're
at least getting some hint what might have happened.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-05-09 21:07:35 +02:00
Enrico Weigelt, metux IT consult 172fa8fe2a xfree86: parser: check for alloc failure and possible NULL pointers
Adding paranoid extra checks against allocation failure and NULL pointers.
Even though might not be actually hit in practise, it's still better to
be cautious, just in case. And reducing analyzer noise this way.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-05-09 21:07:35 +02:00
Enrico Weigelt, metux IT consult a9b5bc838a xfree86: x86emu: add extra assert()'s
The analyzer warnings (possible NULL dereference) are probably just
false alarms. But for safety adding assert()'s, which don't cost us
anything in non-debug builds.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-05-09 21:07:35 +02:00
19 changed files with 320 additions and 77 deletions

View File

@ -181,7 +181,9 @@ configureInputSection(void)
} }
} }
mouse = calloc(1, sizeof(XF86ConfInputRec)); if (!(mouse = calloc(1, sizeof(XF86ConfInputRec))))
return NULL;
mouse->inp_identifier = XNFstrdup("Mouse0"); mouse->inp_identifier = XNFstrdup("Mouse0");
mouse->inp_driver = XNFstrdup("mouse"); mouse->inp_driver = XNFstrdup("mouse");
mouse->inp_option_lst = mouse->inp_option_lst =
@ -213,9 +215,9 @@ configureScreenSection(int screennum)
ptr->scrn_device_str = tmp; ptr->scrn_device_str = tmp;
for (i = 0; i < ARRAY_SIZE(depths); i++) { for (i = 0; i < ARRAY_SIZE(depths); i++) {
XF86ConfDisplayPtr conf_display; XF86ConfDisplayPtr conf_display = calloc(1, sizeof(XF86ConfDisplayRec));
if (!conf_display)
conf_display = calloc(1, sizeof(XF86ConfDisplayRec)); continue;
conf_display->disp_depth = depths[i]; conf_display->disp_depth = depths[i];
conf_display->disp_black.red = conf_display->disp_white.red = -1; conf_display->disp_black.red = conf_display->disp_white.red = -1;
conf_display->disp_black.green = conf_display->disp_white.green = -1; conf_display->disp_black.green = conf_display->disp_white.green = -1;
@ -339,9 +341,8 @@ configureLayoutSection(void)
ptr->lay_identifier = "X.org Configured"; ptr->lay_identifier = "X.org Configured";
{ {
XF86ConfInputrefPtr iptr; XF86ConfInputrefPtr iptr = calloc(1, sizeof(XF86ConfInputrefRec));
assert(iptr);
iptr = malloc(sizeof(XF86ConfInputrefRec));
iptr->list.next = NULL; iptr->list.next = NULL;
iptr->iref_option_lst = NULL; iptr->iref_option_lst = NULL;
iptr->iref_inputdev_str = XNFstrdup("Mouse0"); iptr->iref_inputdev_str = XNFstrdup("Mouse0");
@ -353,9 +354,8 @@ configureLayoutSection(void)
} }
{ {
XF86ConfInputrefPtr iptr; XF86ConfInputrefPtr iptr = calloc(1, sizeof(XF86ConfInputrefRec));
assert(iptr);
iptr = malloc(sizeof(XF86ConfInputrefRec));
iptr->list.next = NULL; iptr->list.next = NULL;
iptr->iref_option_lst = NULL; iptr->iref_option_lst = NULL;
iptr->iref_inputdev_str = XNFstrdup("Keyboard0"); iptr->iref_inputdev_str = XNFstrdup("Keyboard0");
@ -367,10 +367,10 @@ configureLayoutSection(void)
} }
for (scrnum = 0; scrnum < nDevToConfig; scrnum++) { for (scrnum = 0; scrnum < nDevToConfig; scrnum++) {
XF86ConfAdjacencyPtr aptr;
char *tmp; char *tmp;
aptr = malloc(sizeof(XF86ConfAdjacencyRec)); XF86ConfAdjacencyPtr aptr = calloc(1, sizeof(XF86ConfAdjacencyRec));
assert(aptr);
aptr->list.next = NULL; aptr->list.next = NULL;
aptr->adj_x = 0; aptr->adj_x = 0;
aptr->adj_y = 0; aptr->adj_y = 0;
@ -412,9 +412,9 @@ configureModuleSection(void)
elist = LoaderListDir("extensions", NULL); elist = LoaderListDir("extensions", NULL);
if (elist) { if (elist) {
for (el = elist; *el; el++) { for (el = elist; *el; el++) {
XF86LoadPtr module; XF86LoadPtr module = calloc(1, sizeof(XF86LoadRec));
if (!module)
module = calloc(1, sizeof(XF86LoadRec)); return ptr;
module->load_name = *el; module->load_name = *el;
ptr->mod_load_lst = (XF86LoadPtr) xf86addListItem((glp) ptr-> ptr->mod_load_lst = (XF86LoadPtr) xf86addListItem((glp) ptr->
mod_load_lst, mod_load_lst,
@ -464,6 +464,7 @@ handle_detailed_input(struct detailed_monitor_section *det_mon, void *data)
ptr->mon_modelname = realloc(ptr->mon_modelname, ptr->mon_modelname = realloc(ptr->mon_modelname,
strlen((char *) (det_mon->section.name)) + strlen((char *) (det_mon->section.name)) +
1); 1);
assert(ptr->mon_modelname);
strcpy(ptr->mon_modelname, (char *) (det_mon->section.name)); strcpy(ptr->mon_modelname, (char *) (det_mon->section.name));
break; break;
case DS_RANGES: case DS_RANGES:
@ -653,6 +654,7 @@ DoConfigure(void)
XF86ConfMonitorPtr monitor_ptr; XF86ConfMonitorPtr monitor_ptr;
XF86ConfScreenPtr screen_ptr; XF86ConfScreenPtr screen_ptr;
assert(xf86config);
device_ptr = configureDeviceSection(screennum); device_ptr = configureDeviceSection(screennum);
xf86config->conf_device_lst = (XF86ConfDevicePtr) xf86addListItem((glp) xf86config->conf_device_lst = (XF86ConfDevicePtr) xf86addListItem((glp)
xf86config-> xf86config->

View File

@ -615,7 +615,7 @@ removeInputHandler(IHPtr ih)
p = InputHandlers; p = InputHandlers;
while (p && p->next != ih) while (p && p->next != ih)
p = p->next; p = p->next;
if (ih) if (ih && p)
p->next = ih->next; p->next = ih->next;
} }
free(ih); free(ih);

View File

@ -898,13 +898,15 @@ xf86NameCmp(const char *s1, const char *s2)
char * char *
xf86NormalizeName(const char *s) xf86NormalizeName(const char *s)
{ {
char *ret, *q; char *q;
const char *p; const char *p;
if (s == NULL) if (s == NULL)
return NULL; return NULL;
ret = malloc(strlen(s) + 1); char *ret = calloc(1, strlen(s) + 1);
if (!ret)
return NULL;
for (p = s, q = ret; *p != 0; p++) { for (p = s, q = ret; *p != 0; p++) {
switch (*p) { switch (*p) {
case '_': case '_':

View File

@ -684,7 +684,7 @@ xf86platformAddDevice(const char *driver_name, int index)
} }
} }
if (i == xf86NumDrivers) { if (!drvp) {
ErrorF("can't find driver %s for hotplugged device\n", driver_name); ErrorF("can't find driver %s for hotplugged device\n", driver_name);
return -1; return -1;
} }

View File

@ -45,6 +45,9 @@ find_start(unsigned int *ptr)
unsigned int comp[9], test[9]; unsigned int comp[9], test[9];
int i, j; int i, j;
if (!ptr)
return -1;
for (i = 0; i < 9; i++) { for (i = 0; i < 9; i++) {
comp[i] = *(ptr++); comp[i] = *(ptr++);
test[i] = 1; test[i] = 1;

View File

@ -105,6 +105,15 @@ drmServerInfo DRIDRMServerInfo;
*/ */
#define DRI_MSG_VERBOSITY 1 #define DRI_MSG_VERBOSITY 1
static inline DRIScreenPrivPtr DRI_SCREEN_PRIV(ScreenPtr pScreen) {
if (!dixPrivateKeyRegistered(&DRIScreenPrivKeyRec))
return NULL;
if (!pScreen)
return NULL;
return dixLookupPrivate(&(pScreen)->devPrivates, DRIScreenPrivKey);
}
static void static void
DRIDrvMsg(int scrnIndex, MessageType type, const char *format, ...) DRIDrvMsg(int scrnIndex, MessageType type, const char *format, ...)
_X_ATTRIBUTE_PRINTF(3,4); _X_ATTRIBUTE_PRINTF(3,4);
@ -286,6 +295,7 @@ static void
dri_crtc_notify(ScreenPtr pScreen) dri_crtc_notify(ScreenPtr pScreen)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
assert(pDRIPriv);
DRIClipNotifyAllDrawables(pScreen); DRIClipNotifyAllDrawables(pScreen);
xf86_unwrap_crtc_notify(pScreen, pDRIPriv->xf86_crtc_notify); xf86_unwrap_crtc_notify(pScreen, pDRIPriv->xf86_crtc_notify);
@ -640,6 +650,8 @@ Bool
DRIFinishScreenInit(ScreenPtr pScreen) DRIFinishScreenInit(ScreenPtr pScreen)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return FALSE;
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo; DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
/* Wrap DRI support */ /* Wrap DRI support */
@ -865,6 +877,8 @@ Bool
DRIOpenConnection(ScreenPtr pScreen, drm_handle_t * hSAREA, char **busIdString) DRIOpenConnection(ScreenPtr pScreen, drm_handle_t * hSAREA, char **busIdString)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return FALSE;
*hSAREA = pDRIPriv->hSAREA; *hSAREA = pDRIPriv->hSAREA;
*busIdString = pDRIPriv->pDriverInfo->busIdString; *busIdString = pDRIPriv->pDriverInfo->busIdString;
@ -876,6 +890,8 @@ Bool
DRIAuthConnection(ScreenPtr pScreen, drm_magic_t magic) DRIAuthConnection(ScreenPtr pScreen, drm_magic_t magic)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return FALSE;
if (drmAuthMagic(pDRIPriv->drmFD, magic)) if (drmAuthMagic(pDRIPriv->drmFD, magic))
return FALSE; return FALSE;
@ -895,6 +911,8 @@ DRIGetClientDriverName(ScreenPtr pScreen,
int *ddxDriverPatchVersion, char **clientDriverName) int *ddxDriverPatchVersion, char **clientDriverName)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return FALSE;
*ddxDriverMajorVersion = pDRIPriv->pDriverInfo->ddxDriverMajorVersion; *ddxDriverMajorVersion = pDRIPriv->pDriverInfo->ddxDriverMajorVersion;
*ddxDriverMinorVersion = pDRIPriv->pDriverInfo->ddxDriverMinorVersion; *ddxDriverMinorVersion = pDRIPriv->pDriverInfo->ddxDriverMinorVersion;
@ -921,6 +939,8 @@ DRICreateContextPriv(ScreenPtr pScreen,
drm_context_t * pHWContext, DRIContextFlags flags) drm_context_t * pHWContext, DRIContextFlags flags)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return NULL;
if (drmCreateContext(pDRIPriv->drmFD, pHWContext)) { if (drmCreateContext(pDRIPriv->drmFD, pHWContext)) {
return NULL; return NULL;
@ -933,10 +953,15 @@ DRIContextPrivPtr
DRICreateContextPrivFromHandle(ScreenPtr pScreen, DRICreateContextPrivFromHandle(ScreenPtr pScreen,
drm_context_t hHWContext, DRIContextFlags flags) drm_context_t hHWContext, DRIContextFlags flags)
{ {
assert(pScreen);
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return NULL;
DRIContextPrivPtr pDRIContextPriv; DRIContextPrivPtr pDRIContextPriv;
int contextPrivSize; int contextPrivSize;
assert(pDRIPriv);
contextPrivSize = sizeof(DRIContextPrivRec) + contextPrivSize = sizeof(DRIContextPrivRec) +
pDRIPriv->pDriverInfo->contextSize; pDRIPriv->pDriverInfo->contextSize;
if (!(pDRIContextPriv = calloc(1, contextPrivSize))) { if (!(pDRIContextPriv = calloc(1, contextPrivSize))) {
@ -974,12 +999,12 @@ DRICreateContextPrivFromHandle(ScreenPtr pScreen,
Bool Bool
DRIDestroyContextPriv(DRIContextPrivPtr pDRIContextPriv) DRIDestroyContextPriv(DRIContextPrivPtr pDRIContextPriv)
{ {
DRIScreenPrivPtr pDRIPriv;
if (!pDRIContextPriv) if (!pDRIContextPriv)
return TRUE; return TRUE;
pDRIPriv = DRI_SCREEN_PRIV(pDRIContextPriv->pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pDRIContextPriv->pScreen);
if (!pDRIPriv)
return FALSE;
if (!(pDRIContextPriv->flags & DRI_CONTEXT_RESERVED)) { if (!(pDRIContextPriv->flags & DRI_CONTEXT_RESERVED)) {
/* Don't delete reserved contexts from /* Don't delete reserved contexts from
@ -1003,9 +1028,14 @@ static Bool
DRICreateDummyContext(ScreenPtr pScreen, Bool needCtxPriv) DRICreateDummyContext(ScreenPtr pScreen, Bool needCtxPriv)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (pDRIPriv)
return FALSE;
DRIContextPrivPtr pDRIContextPriv; DRIContextPrivPtr pDRIContextPriv;
void *contextStore; void *contextStore;
assert(pDRIPriv);
assert(pDRIPriv->pSAREA);
if (!(pDRIContextPriv = if (!(pDRIContextPriv =
DRICreateContextPriv(pScreen, &pDRIPriv->pSAREA->dummy_context, 0))) { DRICreateContextPriv(pScreen, &pDRIPriv->pSAREA->dummy_context, 0))) {
return FALSE; return FALSE;
@ -1031,6 +1061,8 @@ static void
DRIDestroyDummyContext(ScreenPtr pScreen, Bool hasCtxPriv) DRIDestroyDummyContext(ScreenPtr pScreen, Bool hasCtxPriv)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return;
DRIContextPrivPtr pDRIContextPriv = pDRIPriv->dummyCtxPriv; DRIContextPrivPtr pDRIContextPriv = pDRIPriv->dummyCtxPriv;
void *contextStore; void *contextStore;
@ -1053,6 +1085,8 @@ DRICreateContext(ScreenPtr pScreen, VisualPtr visual,
XID context, drm_context_t * pHWContext) XID context, drm_context_t * pHWContext)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return FALSE;
DRIContextPrivPtr pDRIContextPriv; DRIContextPrivPtr pDRIContextPriv;
void *contextStore; void *contextStore;
@ -1099,12 +1133,12 @@ Bool
DRIContextPrivDelete(void *pResource, XID id) DRIContextPrivDelete(void *pResource, XID id)
{ {
DRIContextPrivPtr pDRIContextPriv = (DRIContextPrivPtr) pResource; DRIContextPrivPtr pDRIContextPriv = (DRIContextPrivPtr) pResource;
DRIScreenPrivPtr pDRIPriv; DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pDRIContextPriv->pScreen);
void *contextStore; if ((!pDRIPriv) || (!pDRIPriv->pDriverInfo))
return FALSE;
pDRIPriv = DRI_SCREEN_PRIV(pDRIContextPriv->pScreen);
if (pDRIPriv->pDriverInfo->DestroyContext) { if (pDRIPriv->pDriverInfo->DestroyContext) {
contextStore = DRIGetContextStore(pDRIContextPriv); void *contextStore = DRIGetContextStore(pDRIContextPriv);
pDRIPriv->pDriverInfo->DestroyContext(pDRIContextPriv->pScreen, pDRIPriv->pDriverInfo->DestroyContext(pDRIContextPriv->pScreen,
pDRIContextPriv->hwContext, pDRIContextPriv->hwContext,
(DRIContextType) (long) (DRIContextType) (long)
@ -1124,7 +1158,8 @@ DRIClipNotifyAllDrawables(ScreenPtr pScreen)
{ {
int i; int i;
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return;
for (i = 0; i < pDRIPriv->pDriverInfo->maxDrawableTableEntry; i++) { for (i = 0; i < pDRIPriv->pDriverInfo->maxDrawableTableEntry; i++) {
pDRIPriv->pSAREA->drawableTable[i].stamp = DRIDrawableValidationStamp++; pDRIPriv->pSAREA->drawableTable[i].stamp = DRIDrawableValidationStamp++;
} }
@ -1134,6 +1169,8 @@ static void
DRITransitionToSharedBuffers(ScreenPtr pScreen) DRITransitionToSharedBuffers(ScreenPtr pScreen)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return;
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo; DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
DRIClipNotifyAllDrawables(pScreen); DRIClipNotifyAllDrawables(pScreen);
@ -1146,6 +1183,8 @@ static void
DRITransitionToPrivateBuffers(ScreenPtr pScreen) DRITransitionToPrivateBuffers(ScreenPtr pScreen)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return;
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo; DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
DRIClipNotifyAllDrawables(pScreen); DRIClipNotifyAllDrawables(pScreen);
@ -1158,6 +1197,8 @@ static void
DRITransitionTo3d(ScreenPtr pScreen) DRITransitionTo3d(ScreenPtr pScreen)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return;
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo; DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
DRIClipNotifyAllDrawables(pScreen); DRIClipNotifyAllDrawables(pScreen);
@ -1170,6 +1211,8 @@ static void
DRITransitionTo2d(ScreenPtr pScreen) DRITransitionTo2d(ScreenPtr pScreen)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return;
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo; DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
DRIClipNotifyAllDrawables(pScreen); DRIClipNotifyAllDrawables(pScreen);
@ -1186,6 +1229,8 @@ DRIDCNTreeTraversal(WindowPtr pWin, void *data)
if (pDRIDrawablePriv) { if (pDRIDrawablePriv) {
ScreenPtr pScreen = pWin->drawable.pScreen; ScreenPtr pScreen = pWin->drawable.pScreen;
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return WT_WALKCHILDREN;
if (RegionNumRects(&pWin->clipList) > 0) { if (RegionNumRects(&pWin->clipList) > 0) {
WindowPtr *pDRIWindows = (WindowPtr *) data; WindowPtr *pDRIWindows = (WindowPtr *) data;
@ -1211,7 +1256,7 @@ DRIDriverClipNotify(ScreenPtr pScreen)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (pDRIPriv->pDriverInfo->ClipNotify) { if (pDRIPriv && pDRIPriv->pDriverInfo && pDRIPriv->pDriverInfo->ClipNotify) {
WindowPtr *pDRIWindows = calloc(pDRIPriv->nrWindows, sizeof(WindowPtr)); WindowPtr *pDRIWindows = calloc(pDRIPriv->nrWindows, sizeof(WindowPtr));
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo; DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
@ -1231,6 +1276,8 @@ static void
DRIIncreaseNumberVisible(ScreenPtr pScreen) DRIIncreaseNumberVisible(ScreenPtr pScreen)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return;
switch (++pDRIPriv->nrWindowsVisible) { switch (++pDRIPriv->nrWindowsVisible) {
case 1: case 1:
@ -1250,6 +1297,8 @@ static void
DRIDecreaseNumberVisible(ScreenPtr pScreen) DRIDecreaseNumberVisible(ScreenPtr pScreen)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return;
switch (--pDRIPriv->nrWindowsVisible) { switch (--pDRIPriv->nrWindowsVisible) {
case 0: case 0:
@ -1270,6 +1319,9 @@ DRICreateDrawable(ScreenPtr pScreen, ClientPtr client, DrawablePtr pDrawable,
drm_drawable_t * hHWDrawable) drm_drawable_t * hHWDrawable)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return FALSE;
DRIDrawablePrivPtr pDRIDrawablePriv; DRIDrawablePrivPtr pDRIDrawablePriv;
WindowPtr pWin; WindowPtr pWin;
@ -1338,13 +1390,15 @@ DRIDrawablePrivDestroy(WindowPtr pWin)
{ {
DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin); DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
ScreenPtr pScreen; ScreenPtr pScreen;
DRIScreenPrivPtr pDRIPriv;
if (!pDRIDrawablePriv) if (!pDRIDrawablePriv)
return; return;
pScreen = pWin->drawable.pScreen; pScreen = pWin->drawable.pScreen;
pDRIPriv = DRI_SCREEN_PRIV(pScreen);
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return;
if (pDRIDrawablePriv->drawableIndex != -1) { if (pDRIDrawablePriv->drawableIndex != -1) {
/* bump stamp to force outstanding 3D requests to resync */ /* bump stamp to force outstanding 3D requests to resync */
@ -1439,6 +1493,9 @@ DRIGetDrawableInfo(ScreenPtr pScreen,
int *numBackClipRects, drm_clip_rect_t ** pBackClipRects) int *numBackClipRects, drm_clip_rect_t ** pBackClipRects)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return FALSE;
DRIDrawablePrivPtr pDRIDrawablePriv, pOldDrawPriv; DRIDrawablePrivPtr pDRIDrawablePriv, pOldDrawPriv;
WindowPtr pWin, pOldWin; WindowPtr pWin, pOldWin;
int i; int i;
@ -1608,6 +1665,8 @@ DRIGetDeviceInfo(ScreenPtr pScreen,
int *fbStride, int *devPrivateSize, void **pDevPrivate) int *fbStride, int *devPrivateSize, void **pDevPrivate)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return FALSE;
*hFrameBuffer = pDRIPriv->pDriverInfo->hFrameBuffer; *hFrameBuffer = pDRIPriv->pDriverInfo->hFrameBuffer;
*fbOrigin = 0; *fbOrigin = 0;
@ -1684,6 +1743,8 @@ void
DRIDoWakeupHandler(ScreenPtr pScreen, int result) DRIDoWakeupHandler(ScreenPtr pScreen, int result)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return;
DRILock(pScreen, 0); DRILock(pScreen, 0);
if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) { if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) {
@ -1701,6 +1762,8 @@ void
DRIDoBlockHandler(ScreenPtr pScreen, void *timeout) DRIDoBlockHandler(ScreenPtr pScreen, void *timeout)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return;
if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) { if (pDRIPriv->pDriverInfo->driverSwapMethod == DRI_HIDE_X_CONTEXT) {
/* hide X context by swapping 2D component here */ /* hide X context by swapping 2D component here */
@ -1726,6 +1789,9 @@ DRISwapContext(int drmFD, void *oldctx, void *newctx)
DRIContextPrivPtr newContext = (DRIContextPrivPtr) newctx; DRIContextPrivPtr newContext = (DRIContextPrivPtr) newctx;
ScreenPtr pScreen = newContext->pScreen; ScreenPtr pScreen = newContext->pScreen;
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return;
void *oldContextStore = NULL; void *oldContextStore = NULL;
DRIContextType oldContextType; DRIContextType oldContextType;
void *newContextStore = NULL; void *newContextStore = NULL;
@ -1880,7 +1946,7 @@ DRIWindowExposures(WindowPtr pWin, RegionPtr prgn)
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin); DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
if (pDRIDrawablePriv) { if (pDRIPriv && pDRIDrawablePriv) {
(*pDRIPriv->pDriverInfo->InitBuffers) (pWin, prgn, (*pDRIPriv->pDriverInfo->InitBuffers) (pWin, prgn,
pDRIDrawablePriv->drawableIndex); pDRIDrawablePriv->drawableIndex);
} }
@ -1908,6 +1974,8 @@ DRITreeTraversal(WindowPtr pWin, void *data)
if (pDRIDrawablePriv) { if (pDRIDrawablePriv) {
ScreenPtr pScreen = pWin->drawable.pScreen; ScreenPtr pScreen = pWin->drawable.pScreen;
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return WT_WALKCHILDREN;
if (RegionNumRects(&(pWin->clipList)) > 0) { if (RegionNumRects(&(pWin->clipList)) > 0) {
RegionPtr reg = (RegionPtr) data; RegionPtr reg = (RegionPtr) data;
@ -2146,24 +2214,24 @@ CARD32
DRIGetDrawableIndex(WindowPtr pWin) DRIGetDrawableIndex(WindowPtr pWin)
{ {
ScreenPtr pScreen = pWin->drawable.pScreen; ScreenPtr pScreen = pWin->drawable.pScreen;
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin); DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
CARD32 index; if (pDRIDrawablePriv)
return pDRIDrawablePriv->drawableIndex;
if (pDRIDrawablePriv) { DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
index = pDRIDrawablePriv->drawableIndex; if (pDRIPriv)
} return pDRIPriv->pDriverInfo->ddxDrawableTableEntry;
else {
index = pDRIPriv->pDriverInfo->ddxDrawableTableEntry;
}
return index; return 0;
} }
unsigned int unsigned int
DRIGetDrawableStamp(ScreenPtr pScreen, CARD32 drawable_index) DRIGetDrawableStamp(ScreenPtr pScreen, CARD32 drawable_index)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return 0;
return pDRIPriv->pSAREA->drawableTable[drawable_index].stamp; return pDRIPriv->pSAREA->drawableTable[drawable_index].stamp;
} }
@ -2172,6 +2240,8 @@ void
DRIPrintDrawableLock(ScreenPtr pScreen, char *msg) DRIPrintDrawableLock(ScreenPtr pScreen, char *msg)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen); DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return;
ErrorF("%s: %d\n", msg, pDRIPriv->pSAREA->drawable_lock.lock); ErrorF("%s: %d\n", msg, pDRIPriv->pSAREA->drawable_lock.lock);
} }
@ -2268,6 +2338,9 @@ DRIGetTexOffsetFuncs(ScreenPtr pScreen,
DRIWrappedFuncsRec * DRIWrappedFuncsRec *
DRIGetWrappedFuncs(ScreenPtr pScreen) DRIGetWrappedFuncs(ScreenPtr pScreen)
{ {
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv)
return NULL;
return &(DRI_SCREEN_PRIV(pScreen)->wrap); return &(DRI_SCREEN_PRIV(pScreen)->wrap);
} }

View File

@ -58,10 +58,6 @@ struct _DRIContextPrivRec {
void **pContextStore; void **pContextStore;
}; };
#define DRI_SCREEN_PRIV(pScreen) ((DRIScreenPrivPtr) \
(dixPrivateKeyRegistered(DRIScreenPrivKey) ? \
dixLookupPrivate(&(pScreen)->devPrivates, DRIScreenPrivKey) : NULL))
#define DRI_SCREEN_PRIV_FROM_INDEX(screenIndex) ((DRIScreenPrivPtr) \ #define DRI_SCREEN_PRIV_FROM_INDEX(screenIndex) ((DRIScreenPrivPtr) \
dixLookupPrivate(&screenInfo.screens[screenIndex]->devPrivates, \ dixLookupPrivate(&screenInfo.screens[screenIndex]->devPrivates, \
DRIScreenPrivKey)) DRIScreenPrivKey))

View File

@ -834,8 +834,6 @@ VBESetGetPaletteData(vbeInfoPtr pVbe, Bool set, int first, int num,
VBEpmi * VBEpmi *
VBEGetVBEpmi(vbeInfoPtr pVbe) VBEGetVBEpmi(vbeInfoPtr pVbe)
{ {
VBEpmi *pmi;
/* /*
Input: Input:
AH := 4Fh Super VGA support AH := 4Fh Super VGA support
@ -859,7 +857,10 @@ VBEGetVBEpmi(vbeInfoPtr pVbe)
if (R16(pVbe->pInt10->ax) != 0x4f) if (R16(pVbe->pInt10->ax) != 0x4f)
return NULL; return NULL;
pmi = malloc(sizeof(VBEpmi)); VBEpmi *pmi = calloc(1, sizeof(VBEpmi));
if (!pmi)
return NULL;
pmi->seg_tbl = R16(pVbe->pInt10->es); pmi->seg_tbl = R16(pVbe->pInt10->es);
pmi->tbl_off = R16(pVbe->pInt10->di); pmi->tbl_off = R16(pVbe->pInt10->di);
pmi->tbl_len = R16(pVbe->pInt10->cx); pmi->tbl_len = R16(pVbe->pInt10->cx);
@ -936,7 +937,8 @@ VBEVesaSaveRestore(vbeInfoPtr pVbe, vbeSaveRestorePtr vbe_sr,
vbe_sr->stateMode = -1; /* invalidate */ vbe_sr->stateMode = -1; /* invalidate */
/* don't rely on the memory not being touched */ /* don't rely on the memory not being touched */
if (vbe_sr->pstate == NULL) if (vbe_sr->pstate == NULL)
vbe_sr->pstate = malloc(vbe_sr->stateSize); vbe_sr->pstate = calloc(1, vbe_sr->stateSize);
assert(vbe_sr->pstate);
memcpy(vbe_sr->pstate, vbe_sr->state, vbe_sr->stateSize); memcpy(vbe_sr->pstate, vbe_sr->state, vbe_sr->stateSize);
} }
ErrorF("VBESaveRestore done with success\n"); ErrorF("VBESaveRestore done with success\n");

View File

@ -405,6 +405,8 @@ VBESetModeParameters(ScrnInfoPtr pScrn, vbeInfoPtr pVbe)
"Attempting to use %dHz refresh for mode \"%s\" (%x)\n", "Attempting to use %dHz refresh for mode \"%s\" (%x)\n",
(int) pMode->VRefresh, pMode->name, data->mode); (int) pMode->VRefresh, pMode->name, data->mode);
data->block = calloc(1, sizeof(VbeCRTCInfoBlock)); data->block = calloc(1, sizeof(VbeCRTCInfoBlock));
if (!data->block)
continue;
data->block->HorizontalTotal = best->HTotal; data->block->HorizontalTotal = best->HTotal;
data->block->HorizontalSyncStart = best->HSyncStart; data->block->HorizontalSyncStart = best->HSyncStart;
data->block->HorizontalSyncEnd = best->HSyncEnd; data->block->HorizontalSyncEnd = best->HSyncEnd;

View File

@ -702,6 +702,8 @@ LoadModule(const char *module, void *options, const XF86ModReqInfo *modreq,
if (!strcmp(m, "vbe")) if (!strcmp(m, "vbe"))
m = name = strdup("int10"); m = name = strdup("int10");
assert(m);
for (cim = compiled_in_modules; *cim; cim++) for (cim = compiled_in_modules; *cim; cim++)
if (!strcmp(m, *cim)) { if (!strcmp(m, *cim)) {
LogMessageVerb(X_INFO, 3, "Module \"%s\" already built-in\n", m); LogMessageVerb(X_INFO, 3, "Module \"%s\" already built-in\n", m);

View File

@ -295,10 +295,10 @@ xf86ComputeCrtcPan(Bool transform_in_use,
* dy = (F T0 - Q0) / U0 * dy = (F T0 - Q0) / U0
* dy = (F P0 - V0) / W0 * dy = (F P0 - V0) / W0
*/ */
double r[3]; double r[3] = { 0 };
double q[2], u[2], t[2], v[2], w[2], p[2]; double q[2], u[2], t[2], v[2], w[2] = { 0 }, p[2];
double f; double f;
struct pixman_f_vector d; struct pixman_f_vector d = { 0 };
int i; int i;
/* Get the un-normalized crtc coordinates again */ /* Get the un-normalized crtc coordinates again */

View File

@ -55,6 +55,8 @@
#include <xorg-config.h> #include <xorg-config.h>
#endif #endif
#include <assert.h>
#include <X11/Xos.h> #include <X11/Xos.h>
#include "xf86Parser.h" #include "xf86Parser.h"
#include "xf86tokens.h" #include "xf86tokens.h"
@ -109,9 +111,9 @@ xf86parseFilesSection(void)
} }
} }
ptr->file_fontpath = realloc(ptr->file_fontpath, i); ptr->file_fontpath = realloc(ptr->file_fontpath, i);
assert(ptr->file_fontpath);
if (j) if (j)
strcat(ptr->file_fontpath, ","); strcat(ptr->file_fontpath, ",");
strcat(ptr->file_fontpath, str); strcat(ptr->file_fontpath, str);
free(xf86_lex_val.str); free(xf86_lex_val.str);
break; break;
@ -121,7 +123,8 @@ xf86parseFilesSection(void)
l = FALSE; l = FALSE;
str = xf86_lex_val.str; str = xf86_lex_val.str;
if (ptr->file_modulepath == NULL) { if (ptr->file_modulepath == NULL) {
ptr->file_modulepath = malloc(1); ptr->file_modulepath = calloc(1, 1);
assert(ptr->file_modulepath);
ptr->file_modulepath[0] = '\0'; ptr->file_modulepath[0] = '\0';
k = strlen(str) + 1; k = strlen(str) + 1;
} }
@ -134,6 +137,7 @@ xf86parseFilesSection(void)
} }
} }
ptr->file_modulepath = realloc(ptr->file_modulepath, k); ptr->file_modulepath = realloc(ptr->file_modulepath, k);
assert(ptr->file_modulepath);
if (l) if (l)
strcat(ptr->file_modulepath, ","); strcat(ptr->file_modulepath, ",");

View File

@ -55,6 +55,8 @@
#include <xorg-config.h> #include <xorg-config.h>
#endif #endif
#include <assert.h>
#include "xf86Parser.h" #include "xf86Parser.h"
#include "xf86tokens.h" #include "xf86tokens.h"
#include "Configint.h" #include "Configint.h"
@ -200,6 +202,7 @@ addNewOption2(XF86OptionPtr head, char *name, char *_val, int used)
} }
else else
new = calloc(1, sizeof(*new)); new = calloc(1, sizeof(*new));
assert(new);
new->opt_name = name; new->opt_name = name;
new->opt_val = _val; new->opt_val = _val;
new->opt_used = used; new->opt_used = used;
@ -437,6 +440,7 @@ xf86parseOption(XF86OptionPtr head)
name = xf86_lex_val.str; name = xf86_lex_val.str;
if ((token = xf86getSubToken(&comment)) == STRING) { if ((token = xf86getSubToken(&comment)) == STRING) {
option = xf86newOption(name, xf86_lex_val.str); option = xf86newOption(name, xf86_lex_val.str);
assert(option);
option->opt_comment = comment; option->opt_comment = comment;
if ((token = xf86getToken(NULL)) == COMMENT) { if ((token = xf86getToken(NULL)) == COMMENT) {
option->opt_comment = xf86addComment(option->opt_comment, xf86_lex_val.str); option->opt_comment = xf86addComment(option->opt_comment, xf86_lex_val.str);
@ -448,6 +452,7 @@ xf86parseOption(XF86OptionPtr head)
} }
else { else {
option = xf86newOption(name, NULL); option = xf86newOption(name, NULL);
assert(option);
option->opt_comment = comment; option->opt_comment = comment;
if (token == COMMENT) { if (token == COMMENT) {
option->opt_comment = xf86addComment(option->opt_comment, xf86_lex_val.str); option->opt_comment = xf86addComment(option->opt_comment, xf86_lex_val.str);

View File

@ -450,9 +450,9 @@ xf86layoutAddInputDevices(XF86ConfigPtr config, XF86ConfLayoutPtr layout)
} }
if (!iref) { if (!iref) {
XF86ConfInputrefPtr iptr; XF86ConfInputrefPtr iptr = calloc(1, sizeof(XF86ConfInputrefRec));
if (!iptr)
iptr = calloc(1, sizeof(XF86ConfInputrefRec)); return -1;
iptr->iref_inputdev_str = input->inp_identifier; iptr->iref_inputdev_str = input->inp_identifier;
layout->lay_input_lst = (XF86ConfInputrefPtr) layout->lay_input_lst = (XF86ConfInputrefPtr)
xf86addListItem((glp) layout->lay_input_lst, (glp) iptr); xf86addListItem((glp) layout->lay_input_lst, (glp) iptr);

View File

@ -56,6 +56,8 @@
#include <xorg-config.h> #include <xorg-config.h>
#endif #endif
#include <assert.h>
#include "xf86Parser.h" #include "xf86Parser.h"
#include "xf86tokens.h" #include "xf86tokens.h"
#include "Configint.h" #include "Configint.h"
@ -228,6 +230,7 @@ xf86addNewLoadDirective(XF86LoadPtr head, const char *name, int type,
int token; int token;
new = calloc(1, sizeof(XF86LoadRec)); new = calloc(1, sizeof(XF86LoadRec));
assert(new);
new->load_name = name; new->load_name = name;
new->load_type = type; new->load_type = type;
new->load_opt = opts; new->load_opt = opts;

View File

@ -57,10 +57,13 @@ xf86freeOutputClassList(XF86ConfOutputClassPtr ptr)
TestFree(ptr->modulepath); TestFree(ptr->modulepath);
xorg_list_for_each_entry_safe(group, next, &ptr->match_driver, entry) { xorg_list_for_each_entry_safe(group, next, &ptr->match_driver, entry) {
xorg_list_del(&group->entry); for (list = group->values; *list; list++) {
for (list = group->values; *list; list++)
free(*list); free(*list);
*list = NULL;
}
xorg_list_del(&group->entry);
free(group); free(group);
group = NULL;
} }
xf86optionListFree(ptr->option_lst); xf86optionListFree(ptr->option_lst);

View File

@ -569,7 +569,6 @@ static char *
DoSubstitution(const char *template, const char *cmdline, const char *projroot, DoSubstitution(const char *template, const char *cmdline, const char *projroot,
int *cmdlineUsed, int *envUsed, const char *XConfigFile) int *cmdlineUsed, int *envUsed, const char *XConfigFile)
{ {
char *result;
int i, l; int i, l;
static const char *env = NULL; static const char *env = NULL;
static char *hostname = NULL; static char *hostname = NULL;
@ -582,7 +581,10 @@ DoSubstitution(const char *template, const char *cmdline, const char *projroot,
if (envUsed) if (envUsed)
*envUsed = 0; *envUsed = 0;
result = malloc(PATH_MAX + 1); char *result = calloc(1, PATH_MAX + 1);
if (!result)
return NULL;
l = 0; l = 0;
for (i = 0; template[i]; i++) { for (i = 0; template[i]; i++) {
if (template[i] != '%') { if (template[i] != '%') {

View File

@ -294,7 +294,9 @@ vert_refresh(int h_pixels, int v_lines, float freq, int interlaced, int margins)
float h_front_porch; float h_front_porch;
float v_odd_front_porch_lines; float v_odd_front_porch_lines;
mode *m = (mode *) malloc(sizeof(mode)); mode *m = (mode *) calloc(1, sizeof(mode));
if (!m)
return NULL;
/* 1. In order to give correct results, the number of horizontal /* 1. In order to give correct results, the number of horizontal
* pixels requested is first processed to ensure that it is divisible * pixels requested is first processed to ensure that it is divisible
@ -604,6 +606,8 @@ parse_command_line(int argc, char *argv[])
int n; int n;
options *o = (options *) calloc(1, sizeof(options)); options *o = (options *) calloc(1, sizeof(options));
if (!o)
goto bad_option;
if (argc < 4) if (argc < 4)
goto bad_option; goto bad_option;

View File

@ -38,6 +38,8 @@
* *
****************************************************************************/ ****************************************************************************/
#include <assert.h>
#include "x86emu/x86emui.h" #include "x86emu/x86emui.h"
#undef bswap_32 #undef bswap_32
@ -377,6 +379,7 @@ x86emuOp2_bt_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_LONG_REGISTER(rh); shiftreg = DECODE_RM_LONG_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0x1F; bit = *shiftreg & 0x1F;
disp = (s16) * shiftreg >> 5; disp = (s16) * shiftreg >> 5;
srcval = fetch_data_long(srcoffset + disp); srcval = fetch_data_long(srcoffset + disp);
@ -390,6 +393,7 @@ x86emuOp2_bt_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_WORD_REGISTER(rh); shiftreg = DECODE_RM_WORD_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0xF; bit = *shiftreg & 0xF;
disp = (s16) * shiftreg >> 4; disp = (s16) * shiftreg >> 4;
srcval = fetch_data_word(srcoffset + disp); srcval = fetch_data_word(srcoffset + disp);
@ -405,6 +409,7 @@ x86emuOp2_bt_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_LONG_REGISTER(rh); shiftreg = DECODE_RM_LONG_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0x1F; bit = *shiftreg & 0x1F;
disp = (s16) * shiftreg >> 5; disp = (s16) * shiftreg >> 5;
srcval = fetch_data_long(srcoffset + disp); srcval = fetch_data_long(srcoffset + disp);
@ -418,6 +423,7 @@ x86emuOp2_bt_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_WORD_REGISTER(rh); shiftreg = DECODE_RM_WORD_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0xF; bit = *shiftreg & 0xF;
disp = (s16) * shiftreg >> 4; disp = (s16) * shiftreg >> 4;
srcval = fetch_data_word(srcoffset + disp); srcval = fetch_data_word(srcoffset + disp);
@ -433,6 +439,7 @@ x86emuOp2_bt_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_LONG_REGISTER(rh); shiftreg = DECODE_RM_LONG_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0x1F; bit = *shiftreg & 0x1F;
disp = (s16) * shiftreg >> 5; disp = (s16) * shiftreg >> 5;
srcval = fetch_data_long(srcoffset + disp); srcval = fetch_data_long(srcoffset + disp);
@ -446,6 +453,7 @@ x86emuOp2_bt_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_WORD_REGISTER(rh); shiftreg = DECODE_RM_WORD_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0xF; bit = *shiftreg & 0xF;
disp = (s16) * shiftreg >> 4; disp = (s16) * shiftreg >> 4;
srcval = fetch_data_word(srcoffset + disp); srcval = fetch_data_word(srcoffset + disp);
@ -460,7 +468,10 @@ x86emuOp2_bt_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_LONG_REGISTER(rh); shiftreg = DECODE_RM_LONG_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0x1F; bit = *shiftreg & 0x1F;
assert(shiftreg);
assert(srcreg);
CONDITIONAL_SET_FLAG(*srcreg & (0x1 << bit), F_CF); CONDITIONAL_SET_FLAG(*srcreg & (0x1 << bit), F_CF);
} }
else { else {
@ -470,7 +481,9 @@ x86emuOp2_bt_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_WORD_REGISTER(rh); shiftreg = DECODE_RM_WORD_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0xF; bit = *shiftreg & 0xF;
assert(srcreg);
CONDITIONAL_SET_FLAG(*srcreg & (0x1 << bit), F_CF); CONDITIONAL_SET_FLAG(*srcreg & (0x1 << bit), F_CF);
} }
break; break;
@ -507,6 +520,7 @@ x86emuOp2_shld_IMM(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF2("%d\n", shift); DECODE_PRINTF2("%d\n", shift);
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_long(destoffset); destval = fetch_data_long(destoffset);
assert(shiftreg);
destval = shld_long(destval, *shiftreg, shift); destval = shld_long(destval, *shiftreg, shift);
store_data_long(destoffset, destval); store_data_long(destoffset, destval);
} }
@ -522,6 +536,7 @@ x86emuOp2_shld_IMM(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF2("%d\n", shift); DECODE_PRINTF2("%d\n", shift);
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_word(destoffset); destval = fetch_data_word(destoffset);
assert(shiftreg);
destval = shld_word(destval, *shiftreg, shift); destval = shld_word(destval, *shiftreg, shift);
store_data_word(destoffset, destval); store_data_word(destoffset, destval);
} }
@ -539,6 +554,7 @@ x86emuOp2_shld_IMM(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF2("%d\n", shift); DECODE_PRINTF2("%d\n", shift);
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_long(destoffset); destval = fetch_data_long(destoffset);
assert(shiftreg);
destval = shld_long(destval, *shiftreg, shift); destval = shld_long(destval, *shiftreg, shift);
store_data_long(destoffset, destval); store_data_long(destoffset, destval);
} }
@ -554,6 +570,7 @@ x86emuOp2_shld_IMM(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF2("%d\n", shift); DECODE_PRINTF2("%d\n", shift);
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_word(destoffset); destval = fetch_data_word(destoffset);
assert(shiftreg);
destval = shld_word(destval, *shiftreg, shift); destval = shld_word(destval, *shiftreg, shift);
store_data_word(destoffset, destval); store_data_word(destoffset, destval);
} }
@ -571,6 +588,7 @@ x86emuOp2_shld_IMM(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF2("%d\n", shift); DECODE_PRINTF2("%d\n", shift);
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_long(destoffset); destval = fetch_data_long(destoffset);
assert(shiftreg);
destval = shld_long(destval, *shiftreg, shift); destval = shld_long(destval, *shiftreg, shift);
store_data_long(destoffset, destval); store_data_long(destoffset, destval);
} }
@ -586,6 +604,7 @@ x86emuOp2_shld_IMM(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF2("%d\n", shift); DECODE_PRINTF2("%d\n", shift);
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_word(destoffset); destval = fetch_data_word(destoffset);
assert(shiftreg);
destval = shld_word(destval, *shiftreg, shift); destval = shld_word(destval, *shiftreg, shift);
store_data_word(destoffset, destval); store_data_word(destoffset, destval);
} }
@ -601,6 +620,8 @@ x86emuOp2_shld_IMM(u8 X86EMU_UNUSED(op2))
shift = fetch_byte_imm(); shift = fetch_byte_imm();
DECODE_PRINTF2("%d\n", shift); DECODE_PRINTF2("%d\n", shift);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
assert(shiftreg);
*destreg = shld_long(*destreg, *shiftreg, shift); *destreg = shld_long(*destreg, *shiftreg, shift);
} }
else { else {
@ -613,6 +634,8 @@ x86emuOp2_shld_IMM(u8 X86EMU_UNUSED(op2))
shift = fetch_byte_imm(); shift = fetch_byte_imm();
DECODE_PRINTF2("%d\n", shift); DECODE_PRINTF2("%d\n", shift);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
assert(shiftreg);
*destreg = shld_word(*destreg, *shiftreg, shift); *destreg = shld_word(*destreg, *shiftreg, shift);
} }
break; break;
@ -646,6 +669,7 @@ x86emuOp2_shld_CL(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(",CL\n"); DECODE_PRINTF(",CL\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_long(destoffset); destval = fetch_data_long(destoffset);
assert(shiftreg);
destval = shld_long(destval, *shiftreg, M.x86.R_CL); destval = shld_long(destval, *shiftreg, M.x86.R_CL);
store_data_long(destoffset, destval); store_data_long(destoffset, destval);
} }
@ -659,6 +683,7 @@ x86emuOp2_shld_CL(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(",CL\n"); DECODE_PRINTF(",CL\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_word(destoffset); destval = fetch_data_word(destoffset);
assert(shiftreg);
destval = shld_word(destval, *shiftreg, M.x86.R_CL); destval = shld_word(destval, *shiftreg, M.x86.R_CL);
store_data_word(destoffset, destval); store_data_word(destoffset, destval);
} }
@ -674,6 +699,7 @@ x86emuOp2_shld_CL(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(",CL\n"); DECODE_PRINTF(",CL\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_long(destoffset); destval = fetch_data_long(destoffset);
assert(shiftreg);
destval = shld_long(destval, *shiftreg, M.x86.R_CL); destval = shld_long(destval, *shiftreg, M.x86.R_CL);
store_data_long(destoffset, destval); store_data_long(destoffset, destval);
} }
@ -687,6 +713,7 @@ x86emuOp2_shld_CL(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(",CL\n"); DECODE_PRINTF(",CL\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_word(destoffset); destval = fetch_data_word(destoffset);
assert(shiftreg);
destval = shld_word(destval, *shiftreg, M.x86.R_CL); destval = shld_word(destval, *shiftreg, M.x86.R_CL);
store_data_word(destoffset, destval); store_data_word(destoffset, destval);
} }
@ -702,6 +729,7 @@ x86emuOp2_shld_CL(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(",CL\n"); DECODE_PRINTF(",CL\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_long(destoffset); destval = fetch_data_long(destoffset);
assert(shiftreg);
destval = shld_long(destval, *shiftreg, M.x86.R_CL); destval = shld_long(destval, *shiftreg, M.x86.R_CL);
store_data_long(destoffset, destval); store_data_long(destoffset, destval);
} }
@ -715,6 +743,7 @@ x86emuOp2_shld_CL(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(",CL\n"); DECODE_PRINTF(",CL\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_word(destoffset); destval = fetch_data_word(destoffset);
assert(shiftreg);
destval = shld_word(destval, *shiftreg, M.x86.R_CL); destval = shld_word(destval, *shiftreg, M.x86.R_CL);
store_data_word(destoffset, destval); store_data_word(destoffset, destval);
} }
@ -728,6 +757,8 @@ x86emuOp2_shld_CL(u8 X86EMU_UNUSED(op2))
shiftreg = DECODE_RM_LONG_REGISTER(rh); shiftreg = DECODE_RM_LONG_REGISTER(rh);
DECODE_PRINTF(",CL\n"); DECODE_PRINTF(",CL\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
assert(shiftreg);
*destreg = shld_long(*destreg, *shiftreg, M.x86.R_CL); *destreg = shld_long(*destreg, *shiftreg, M.x86.R_CL);
} }
else { else {
@ -738,6 +769,8 @@ x86emuOp2_shld_CL(u8 X86EMU_UNUSED(op2))
shiftreg = DECODE_RM_WORD_REGISTER(rh); shiftreg = DECODE_RM_WORD_REGISTER(rh);
DECODE_PRINTF(",CL\n"); DECODE_PRINTF(",CL\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
assert(shiftreg);
*destreg = shld_word(*destreg, *shiftreg, M.x86.R_CL); *destreg = shld_word(*destreg, *shiftreg, M.x86.R_CL);
} }
break; break;
@ -800,6 +833,7 @@ x86emuOp2_bts_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_LONG_REGISTER(rh); shiftreg = DECODE_RM_LONG_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0x1F; bit = *shiftreg & 0x1F;
disp = (s16) * shiftreg >> 5; disp = (s16) * shiftreg >> 5;
srcval = fetch_data_long(srcoffset + disp); srcval = fetch_data_long(srcoffset + disp);
@ -815,6 +849,7 @@ x86emuOp2_bts_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_WORD_REGISTER(rh); shiftreg = DECODE_RM_WORD_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0xF; bit = *shiftreg & 0xF;
disp = (s16) * shiftreg >> 4; disp = (s16) * shiftreg >> 4;
srcval = fetch_data_word(srcoffset + disp); srcval = fetch_data_word(srcoffset + disp);
@ -832,6 +867,7 @@ x86emuOp2_bts_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_LONG_REGISTER(rh); shiftreg = DECODE_RM_LONG_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0x1F; bit = *shiftreg & 0x1F;
disp = (s16) * shiftreg >> 5; disp = (s16) * shiftreg >> 5;
srcval = fetch_data_long(srcoffset + disp); srcval = fetch_data_long(srcoffset + disp);
@ -847,6 +883,7 @@ x86emuOp2_bts_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_WORD_REGISTER(rh); shiftreg = DECODE_RM_WORD_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0xF; bit = *shiftreg & 0xF;
disp = (s16) * shiftreg >> 4; disp = (s16) * shiftreg >> 4;
srcval = fetch_data_word(srcoffset + disp); srcval = fetch_data_word(srcoffset + disp);
@ -864,7 +901,9 @@ x86emuOp2_bts_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_LONG_REGISTER(rh); shiftreg = DECODE_RM_LONG_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0x1F; bit = *shiftreg & 0x1F;
assert(shiftreg);
disp = (s16) * shiftreg >> 5; disp = (s16) * shiftreg >> 5;
srcval = fetch_data_long(srcoffset + disp); srcval = fetch_data_long(srcoffset + disp);
mask = (0x1 << bit); mask = (0x1 << bit);
@ -879,6 +918,7 @@ x86emuOp2_bts_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_WORD_REGISTER(rh); shiftreg = DECODE_RM_WORD_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0xF; bit = *shiftreg & 0xF;
disp = (s16) * shiftreg >> 4; disp = (s16) * shiftreg >> 4;
srcval = fetch_data_word(srcoffset + disp); srcval = fetch_data_word(srcoffset + disp);
@ -893,8 +933,10 @@ x86emuOp2_bts_R(u8 X86EMU_UNUSED(op2))
u32 mask; u32 mask;
srcreg = DECODE_RM_LONG_REGISTER(rl); srcreg = DECODE_RM_LONG_REGISTER(rl);
assert(srcreg);
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_LONG_REGISTER(rh); shiftreg = DECODE_RM_LONG_REGISTER(rh);
assert(shiftreg);
TRACE_AND_STEP(); TRACE_AND_STEP();
bit = *shiftreg & 0x1F; bit = *shiftreg & 0x1F;
mask = (0x1 << bit); mask = (0x1 << bit);
@ -909,8 +951,10 @@ x86emuOp2_bts_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_WORD_REGISTER(rh); shiftreg = DECODE_RM_WORD_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0xF; bit = *shiftreg & 0xF;
mask = (u16) (0x1 << bit); mask = (u16) (0x1 << bit);
assert(srcreg);
CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF); CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF);
*srcreg |= mask; *srcreg |= mask;
} }
@ -948,6 +992,7 @@ x86emuOp2_shrd_IMM(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF2("%d\n", shift); DECODE_PRINTF2("%d\n", shift);
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_long(destoffset); destval = fetch_data_long(destoffset);
assert(shiftreg);
destval = shrd_long(destval, *shiftreg, shift); destval = shrd_long(destval, *shiftreg, shift);
store_data_long(destoffset, destval); store_data_long(destoffset, destval);
} }
@ -963,6 +1008,7 @@ x86emuOp2_shrd_IMM(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF2("%d\n", shift); DECODE_PRINTF2("%d\n", shift);
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_word(destoffset); destval = fetch_data_word(destoffset);
assert(shiftreg);
destval = shrd_word(destval, *shiftreg, shift); destval = shrd_word(destval, *shiftreg, shift);
store_data_word(destoffset, destval); store_data_word(destoffset, destval);
} }
@ -980,6 +1026,7 @@ x86emuOp2_shrd_IMM(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF2("%d\n", shift); DECODE_PRINTF2("%d\n", shift);
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_long(destoffset); destval = fetch_data_long(destoffset);
assert(shiftreg);
destval = shrd_long(destval, *shiftreg, shift); destval = shrd_long(destval, *shiftreg, shift);
store_data_long(destoffset, destval); store_data_long(destoffset, destval);
} }
@ -995,6 +1042,7 @@ x86emuOp2_shrd_IMM(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF2("%d\n", shift); DECODE_PRINTF2("%d\n", shift);
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_word(destoffset); destval = fetch_data_word(destoffset);
assert(shiftreg);
destval = shrd_word(destval, *shiftreg, shift); destval = shrd_word(destval, *shiftreg, shift);
store_data_word(destoffset, destval); store_data_word(destoffset, destval);
} }
@ -1012,6 +1060,7 @@ x86emuOp2_shrd_IMM(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF2("%d\n", shift); DECODE_PRINTF2("%d\n", shift);
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_long(destoffset); destval = fetch_data_long(destoffset);
assert(shiftreg);
destval = shrd_long(destval, *shiftreg, shift); destval = shrd_long(destval, *shiftreg, shift);
store_data_long(destoffset, destval); store_data_long(destoffset, destval);
} }
@ -1027,6 +1076,7 @@ x86emuOp2_shrd_IMM(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF2("%d\n", shift); DECODE_PRINTF2("%d\n", shift);
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_word(destoffset); destval = fetch_data_word(destoffset);
assert(shiftreg);
destval = shrd_word(destval, *shiftreg, shift); destval = shrd_word(destval, *shiftreg, shift);
store_data_word(destoffset, destval); store_data_word(destoffset, destval);
} }
@ -1042,6 +1092,8 @@ x86emuOp2_shrd_IMM(u8 X86EMU_UNUSED(op2))
shift = fetch_byte_imm(); shift = fetch_byte_imm();
DECODE_PRINTF2("%d\n", shift); DECODE_PRINTF2("%d\n", shift);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
assert(shiftreg);
*destreg = shrd_long(*destreg, *shiftreg, shift); *destreg = shrd_long(*destreg, *shiftreg, shift);
} }
else { else {
@ -1054,6 +1106,8 @@ x86emuOp2_shrd_IMM(u8 X86EMU_UNUSED(op2))
shift = fetch_byte_imm(); shift = fetch_byte_imm();
DECODE_PRINTF2("%d\n", shift); DECODE_PRINTF2("%d\n", shift);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
assert(shiftreg);
*destreg = shrd_word(*destreg, *shiftreg, shift); *destreg = shrd_word(*destreg, *shiftreg, shift);
} }
break; break;
@ -1087,6 +1141,7 @@ x86emuOp2_shrd_CL(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(",CL\n"); DECODE_PRINTF(",CL\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_long(destoffset); destval = fetch_data_long(destoffset);
assert(shiftreg);
destval = shrd_long(destval, *shiftreg, M.x86.R_CL); destval = shrd_long(destval, *shiftreg, M.x86.R_CL);
store_data_long(destoffset, destval); store_data_long(destoffset, destval);
} }
@ -1100,6 +1155,7 @@ x86emuOp2_shrd_CL(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(",CL\n"); DECODE_PRINTF(",CL\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_word(destoffset); destval = fetch_data_word(destoffset);
assert(shiftreg);
destval = shrd_word(destval, *shiftreg, M.x86.R_CL); destval = shrd_word(destval, *shiftreg, M.x86.R_CL);
store_data_word(destoffset, destval); store_data_word(destoffset, destval);
} }
@ -1115,6 +1171,7 @@ x86emuOp2_shrd_CL(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(",CL\n"); DECODE_PRINTF(",CL\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_long(destoffset); destval = fetch_data_long(destoffset);
assert(shiftreg);
destval = shrd_long(destval, *shiftreg, M.x86.R_CL); destval = shrd_long(destval, *shiftreg, M.x86.R_CL);
store_data_long(destoffset, destval); store_data_long(destoffset, destval);
} }
@ -1128,6 +1185,7 @@ x86emuOp2_shrd_CL(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(",CL\n"); DECODE_PRINTF(",CL\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_word(destoffset); destval = fetch_data_word(destoffset);
assert(shiftreg);
destval = shrd_word(destval, *shiftreg, M.x86.R_CL); destval = shrd_word(destval, *shiftreg, M.x86.R_CL);
store_data_word(destoffset, destval); store_data_word(destoffset, destval);
} }
@ -1143,6 +1201,7 @@ x86emuOp2_shrd_CL(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(",CL\n"); DECODE_PRINTF(",CL\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_long(destoffset); destval = fetch_data_long(destoffset);
assert(shiftreg);
destval = shrd_long(destval, *shiftreg, M.x86.R_CL); destval = shrd_long(destval, *shiftreg, M.x86.R_CL);
store_data_long(destoffset, destval); store_data_long(destoffset, destval);
} }
@ -1156,6 +1215,7 @@ x86emuOp2_shrd_CL(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(",CL\n"); DECODE_PRINTF(",CL\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
destval = fetch_data_word(destoffset); destval = fetch_data_word(destoffset);
assert(shiftreg);
destval = shrd_word(destval, *shiftreg, M.x86.R_CL); destval = shrd_word(destval, *shiftreg, M.x86.R_CL);
store_data_word(destoffset, destval); store_data_word(destoffset, destval);
} }
@ -1169,6 +1229,8 @@ x86emuOp2_shrd_CL(u8 X86EMU_UNUSED(op2))
shiftreg = DECODE_RM_LONG_REGISTER(rh); shiftreg = DECODE_RM_LONG_REGISTER(rh);
DECODE_PRINTF(",CL\n"); DECODE_PRINTF(",CL\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
assert(shiftreg);
*destreg = shrd_long(*destreg, *shiftreg, M.x86.R_CL); *destreg = shrd_long(*destreg, *shiftreg, M.x86.R_CL);
} }
else { else {
@ -1179,6 +1241,8 @@ x86emuOp2_shrd_CL(u8 X86EMU_UNUSED(op2))
shiftreg = DECODE_RM_WORD_REGISTER(rh); shiftreg = DECODE_RM_WORD_REGISTER(rh);
DECODE_PRINTF(",CL\n"); DECODE_PRINTF(",CL\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
assert(shiftreg);
*destreg = shrd_word(*destreg, *shiftreg, M.x86.R_CL); *destreg = shrd_word(*destreg, *shiftreg, M.x86.R_CL);
} }
break; break;
@ -1256,6 +1320,7 @@ x86emuOp2_imul_R_RM(u8 X86EMU_UNUSED(op2))
srcoffset = decode_rm01_address(rl); srcoffset = decode_rm01_address(rl);
srcval = fetch_data_long(srcoffset); srcval = fetch_data_long(srcoffset);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
imul_long_direct(&res_lo, &res_hi, (s32) * destreg, (s32) srcval); imul_long_direct(&res_lo, &res_hi, (s32) * destreg, (s32) srcval);
if (res_hi != 0) { if (res_hi != 0) {
SET_FLAG(F_CF); SET_FLAG(F_CF);
@ -1277,6 +1342,7 @@ x86emuOp2_imul_R_RM(u8 X86EMU_UNUSED(op2))
srcoffset = decode_rm01_address(rl); srcoffset = decode_rm01_address(rl);
srcval = fetch_data_word(srcoffset); srcval = fetch_data_word(srcoffset);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
res = (s16) * destreg * (s16) srcval; res = (s16) * destreg * (s16) srcval;
if (res > 0xFFFF) { if (res > 0xFFFF) {
SET_FLAG(F_CF); SET_FLAG(F_CF);
@ -1342,6 +1408,8 @@ x86emuOp2_imul_R_RM(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
srcreg = DECODE_RM_LONG_REGISTER(rl); srcreg = DECODE_RM_LONG_REGISTER(rl);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
assert(srcreg);
imul_long_direct(&res_lo, &res_hi, (s32) * destreg, (s32) * srcreg); imul_long_direct(&res_lo, &res_hi, (s32) * destreg, (s32) * srcreg);
if (res_hi != 0) { if (res_hi != 0) {
SET_FLAG(F_CF); SET_FLAG(F_CF);
@ -1360,6 +1428,8 @@ x86emuOp2_imul_R_RM(u8 X86EMU_UNUSED(op2))
destreg = DECODE_RM_WORD_REGISTER(rh); destreg = DECODE_RM_WORD_REGISTER(rh);
DECODE_PRINTF(","); DECODE_PRINTF(",");
srcreg = DECODE_RM_WORD_REGISTER(rl); srcreg = DECODE_RM_WORD_REGISTER(rl);
assert(destreg);
assert(srcreg);
res = (s16) * destreg * (s16) * srcreg; res = (s16) * destreg * (s16) * srcreg;
if (res > 0xFFFF) { if (res > 0xFFFF) {
SET_FLAG(F_CF); SET_FLAG(F_CF);
@ -1398,6 +1468,7 @@ x86emuOp2_lss_R_IMM(u8 X86EMU_UNUSED(op2))
srcoffset = decode_rm00_address(rl); srcoffset = decode_rm00_address(rl);
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(dstreg);
*dstreg = fetch_data_word(srcoffset); *dstreg = fetch_data_word(srcoffset);
M.x86.R_SS = fetch_data_word(srcoffset + 2); M.x86.R_SS = fetch_data_word(srcoffset + 2);
break; break;
@ -1407,6 +1478,7 @@ x86emuOp2_lss_R_IMM(u8 X86EMU_UNUSED(op2))
srcoffset = decode_rm01_address(rl); srcoffset = decode_rm01_address(rl);
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(dstreg);
*dstreg = fetch_data_word(srcoffset); *dstreg = fetch_data_word(srcoffset);
M.x86.R_SS = fetch_data_word(srcoffset + 2); M.x86.R_SS = fetch_data_word(srcoffset + 2);
break; break;
@ -1451,6 +1523,7 @@ x86emuOp2_btr_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_LONG_REGISTER(rh); shiftreg = DECODE_RM_LONG_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0x1F; bit = *shiftreg & 0x1F;
disp = (s16) * shiftreg >> 5; disp = (s16) * shiftreg >> 5;
srcval = fetch_data_long(srcoffset + disp); srcval = fetch_data_long(srcoffset + disp);
@ -1466,6 +1539,7 @@ x86emuOp2_btr_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_WORD_REGISTER(rh); shiftreg = DECODE_RM_WORD_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0xF; bit = *shiftreg & 0xF;
disp = (s16) * shiftreg >> 4; disp = (s16) * shiftreg >> 4;
srcval = fetch_data_word(srcoffset + disp); srcval = fetch_data_word(srcoffset + disp);
@ -1483,6 +1557,7 @@ x86emuOp2_btr_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_LONG_REGISTER(rh); shiftreg = DECODE_RM_LONG_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0x1F; bit = *shiftreg & 0x1F;
disp = (s16) * shiftreg >> 5; disp = (s16) * shiftreg >> 5;
srcval = fetch_data_long(srcoffset + disp); srcval = fetch_data_long(srcoffset + disp);
@ -1498,6 +1573,7 @@ x86emuOp2_btr_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_WORD_REGISTER(rh); shiftreg = DECODE_RM_WORD_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0xF; bit = *shiftreg & 0xF;
disp = (s16) * shiftreg >> 4; disp = (s16) * shiftreg >> 4;
srcval = fetch_data_word(srcoffset + disp); srcval = fetch_data_word(srcoffset + disp);
@ -1515,6 +1591,7 @@ x86emuOp2_btr_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_LONG_REGISTER(rh); shiftreg = DECODE_RM_LONG_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0x1F; bit = *shiftreg & 0x1F;
disp = (s16) * shiftreg >> 5; disp = (s16) * shiftreg >> 5;
srcval = fetch_data_long(srcoffset + disp); srcval = fetch_data_long(srcoffset + disp);
@ -1530,6 +1607,7 @@ x86emuOp2_btr_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_WORD_REGISTER(rh); shiftreg = DECODE_RM_WORD_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0xF; bit = *shiftreg & 0xF;
disp = (s16) * shiftreg >> 4; disp = (s16) * shiftreg >> 4;
srcval = fetch_data_word(srcoffset + disp); srcval = fetch_data_word(srcoffset + disp);
@ -1547,8 +1625,10 @@ x86emuOp2_btr_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_LONG_REGISTER(rh); shiftreg = DECODE_RM_LONG_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0x1F; bit = *shiftreg & 0x1F;
mask = (0x1 << bit); mask = (0x1 << bit);
assert(srcreg);
CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF); CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF);
*srcreg &= ~mask; *srcreg &= ~mask;
} }
@ -1560,8 +1640,10 @@ x86emuOp2_btr_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_WORD_REGISTER(rh); shiftreg = DECODE_RM_WORD_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0xF; bit = *shiftreg & 0xF;
mask = (u16) (0x1 << bit); mask = (u16) (0x1 << bit);
assert(srcreg);
CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF); CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF);
*srcreg &= ~mask; *srcreg &= ~mask;
} }
@ -1592,6 +1674,7 @@ x86emuOp2_lfs_R_IMM(u8 X86EMU_UNUSED(op2))
srcoffset = decode_rm00_address(rl); srcoffset = decode_rm00_address(rl);
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(dstreg);
*dstreg = fetch_data_word(srcoffset); *dstreg = fetch_data_word(srcoffset);
M.x86.R_FS = fetch_data_word(srcoffset + 2); M.x86.R_FS = fetch_data_word(srcoffset + 2);
break; break;
@ -1601,6 +1684,7 @@ x86emuOp2_lfs_R_IMM(u8 X86EMU_UNUSED(op2))
srcoffset = decode_rm01_address(rl); srcoffset = decode_rm01_address(rl);
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(dstreg);
*dstreg = fetch_data_word(srcoffset); *dstreg = fetch_data_word(srcoffset);
M.x86.R_FS = fetch_data_word(srcoffset + 2); M.x86.R_FS = fetch_data_word(srcoffset + 2);
break; break;
@ -1610,6 +1694,7 @@ x86emuOp2_lfs_R_IMM(u8 X86EMU_UNUSED(op2))
srcoffset = decode_rm10_address(rl); srcoffset = decode_rm10_address(rl);
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(dstreg);
*dstreg = fetch_data_word(srcoffset); *dstreg = fetch_data_word(srcoffset);
M.x86.R_FS = fetch_data_word(srcoffset + 2); M.x86.R_FS = fetch_data_word(srcoffset + 2);
break; break;
@ -1651,6 +1736,7 @@ x86emuOp2_lgs_R_IMM(u8 X86EMU_UNUSED(op2))
srcoffset = decode_rm01_address(rl); srcoffset = decode_rm01_address(rl);
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(dstreg);
*dstreg = fetch_data_word(srcoffset); *dstreg = fetch_data_word(srcoffset);
M.x86.R_GS = fetch_data_word(srcoffset + 2); M.x86.R_GS = fetch_data_word(srcoffset + 2);
break; break;
@ -1722,6 +1808,7 @@ x86emuOp2_movzx_byte_R_RM(u8 X86EMU_UNUSED(op2))
srcval = fetch_data_byte(srcoffset); srcval = fetch_data_byte(srcoffset);
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
*destreg = srcval; *destreg = srcval;
} }
else { else {
@ -1734,6 +1821,7 @@ x86emuOp2_movzx_byte_R_RM(u8 X86EMU_UNUSED(op2))
srcval = fetch_data_byte(srcoffset); srcval = fetch_data_byte(srcoffset);
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
*destreg = srcval; *destreg = srcval;
} }
break; break;
@ -1773,6 +1861,8 @@ x86emuOp2_movzx_byte_R_RM(u8 X86EMU_UNUSED(op2))
srcreg = DECODE_RM_BYTE_REGISTER(rl); srcreg = DECODE_RM_BYTE_REGISTER(rl);
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
assert(srcreg);
*destreg = *srcreg; *destreg = *srcreg;
} }
else { else {
@ -1784,6 +1874,8 @@ x86emuOp2_movzx_byte_R_RM(u8 X86EMU_UNUSED(op2))
srcreg = DECODE_RM_BYTE_REGISTER(rl); srcreg = DECODE_RM_BYTE_REGISTER(rl);
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(srcreg);
assert(destreg);
*destreg = *srcreg; *destreg = *srcreg;
} }
break; break;
@ -1816,6 +1908,7 @@ x86emuOp2_movzx_word_R_RM(u8 X86EMU_UNUSED(op2))
srcval = fetch_data_word(srcoffset); srcval = fetch_data_word(srcoffset);
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
*destreg = srcval; *destreg = srcval;
break; break;
case 1: case 1:
@ -1825,6 +1918,7 @@ x86emuOp2_movzx_word_R_RM(u8 X86EMU_UNUSED(op2))
srcval = fetch_data_word(srcoffset); srcval = fetch_data_word(srcoffset);
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
*destreg = srcval; *destreg = srcval;
break; break;
case 2: case 2:
@ -1834,6 +1928,8 @@ x86emuOp2_movzx_word_R_RM(u8 X86EMU_UNUSED(op2))
srcval = fetch_data_word(srcoffset); srcval = fetch_data_word(srcoffset);
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
assert(srcreg);
*destreg = srcval; *destreg = srcval;
break; break;
case 3: /* register to register */ case 3: /* register to register */
@ -1842,6 +1938,8 @@ x86emuOp2_movzx_word_R_RM(u8 X86EMU_UNUSED(op2))
srcreg = DECODE_RM_WORD_REGISTER(rl); srcreg = DECODE_RM_WORD_REGISTER(rl);
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
assert(srcreg);
*destreg = *srcreg; *destreg = *srcreg;
break; break;
} }
@ -2057,6 +2155,7 @@ x86emuOp2_btX_I(u8 X86EMU_UNUSED(op2))
TRACE_AND_STEP(); TRACE_AND_STEP();
bit = shift & 0x1F; bit = shift & 0x1F;
mask = (0x1 << bit); mask = (0x1 << bit);
assert(srcreg);
CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF); CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF);
switch (rh) { switch (rh) {
case 5: case 5:
@ -2083,6 +2182,7 @@ x86emuOp2_btX_I(u8 X86EMU_UNUSED(op2))
TRACE_AND_STEP(); TRACE_AND_STEP();
bit = shift & 0xF; bit = shift & 0xF;
mask = (0x1 << bit); mask = (0x1 << bit);
assert(srcreg);
CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF); CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF);
switch (rh) { switch (rh) {
case 5: case 5:
@ -2128,6 +2228,7 @@ x86emuOp2_btc_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_LONG_REGISTER(rh); shiftreg = DECODE_RM_LONG_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0x1F; bit = *shiftreg & 0x1F;
disp = (s16) * shiftreg >> 5; disp = (s16) * shiftreg >> 5;
srcval = fetch_data_long(srcoffset + disp); srcval = fetch_data_long(srcoffset + disp);
@ -2143,6 +2244,7 @@ x86emuOp2_btc_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_WORD_REGISTER(rh); shiftreg = DECODE_RM_WORD_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0xF; bit = *shiftreg & 0xF;
disp = (s16) * shiftreg >> 4; disp = (s16) * shiftreg >> 4;
srcval = fetch_data_word(srcoffset + disp); srcval = fetch_data_word(srcoffset + disp);
@ -2160,6 +2262,7 @@ x86emuOp2_btc_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_LONG_REGISTER(rh); shiftreg = DECODE_RM_LONG_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0x1F; bit = *shiftreg & 0x1F;
disp = (s16) * shiftreg >> 5; disp = (s16) * shiftreg >> 5;
srcval = fetch_data_long(srcoffset + disp); srcval = fetch_data_long(srcoffset + disp);
@ -2175,6 +2278,7 @@ x86emuOp2_btc_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_WORD_REGISTER(rh); shiftreg = DECODE_RM_WORD_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0xF; bit = *shiftreg & 0xF;
disp = (s16) * shiftreg >> 4; disp = (s16) * shiftreg >> 4;
srcval = fetch_data_word(srcoffset + disp); srcval = fetch_data_word(srcoffset + disp);
@ -2192,6 +2296,7 @@ x86emuOp2_btc_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_LONG_REGISTER(rh); shiftreg = DECODE_RM_LONG_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0x1F; bit = *shiftreg & 0x1F;
disp = (s16) * shiftreg >> 5; disp = (s16) * shiftreg >> 5;
srcval = fetch_data_long(srcoffset + disp); srcval = fetch_data_long(srcoffset + disp);
@ -2207,6 +2312,7 @@ x86emuOp2_btc_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_WORD_REGISTER(rh); shiftreg = DECODE_RM_WORD_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0xF; bit = *shiftreg & 0xF;
disp = (s16) * shiftreg >> 4; disp = (s16) * shiftreg >> 4;
srcval = fetch_data_word(srcoffset + disp); srcval = fetch_data_word(srcoffset + disp);
@ -2224,8 +2330,10 @@ x86emuOp2_btc_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_LONG_REGISTER(rh); shiftreg = DECODE_RM_LONG_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0x1F; bit = *shiftreg & 0x1F;
mask = (0x1 << bit); mask = (0x1 << bit);
assert(srcreg);
CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF); CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF);
*srcreg ^= mask; *srcreg ^= mask;
} }
@ -2237,8 +2345,10 @@ x86emuOp2_btc_R(u8 X86EMU_UNUSED(op2))
DECODE_PRINTF(","); DECODE_PRINTF(",");
shiftreg = DECODE_RM_WORD_REGISTER(rh); shiftreg = DECODE_RM_WORD_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(shiftreg);
bit = *shiftreg & 0xF; bit = *shiftreg & 0xF;
mask = (u16) (0x1 << bit); mask = (u16) (0x1 << bit);
assert(srcreg);
CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF); CONDITIONAL_SET_FLAG(*srcreg & mask, F_CF);
*srcreg ^= mask; *srcreg ^= mask;
} }
@ -2272,6 +2382,7 @@ x86emuOp2_bsf(u8 X86EMU_UNUSED(op2))
TRACE_AND_STEP(); TRACE_AND_STEP();
srcval = fetch_data_long(srcoffset); srcval = fetch_data_long(srcoffset);
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
assert(dstreg);
for (*dstreg = 0; *dstreg < 32; (*dstreg)++) for (*dstreg = 0; *dstreg < 32; (*dstreg)++)
if ((srcval >> *dstreg) & 1) if ((srcval >> *dstreg) & 1)
break; break;
@ -2285,6 +2396,7 @@ x86emuOp2_bsf(u8 X86EMU_UNUSED(op2))
TRACE_AND_STEP(); TRACE_AND_STEP();
srcval = fetch_data_word(srcoffset); srcval = fetch_data_word(srcoffset);
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
assert(dstreg);
for (*dstreg = 0; *dstreg < 16; (*dstreg)++) for (*dstreg = 0; *dstreg < 16; (*dstreg)++)
if ((srcval >> *dstreg) & 1) if ((srcval >> *dstreg) & 1)
break; break;
@ -2300,6 +2412,7 @@ x86emuOp2_bsf(u8 X86EMU_UNUSED(op2))
TRACE_AND_STEP(); TRACE_AND_STEP();
srcval = fetch_data_long(srcoffset); srcval = fetch_data_long(srcoffset);
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
assert(dstreg);
for (*dstreg = 0; *dstreg < 32; (*dstreg)++) for (*dstreg = 0; *dstreg < 32; (*dstreg)++)
if ((srcval >> *dstreg) & 1) if ((srcval >> *dstreg) & 1)
break; break;
@ -2313,6 +2426,7 @@ x86emuOp2_bsf(u8 X86EMU_UNUSED(op2))
TRACE_AND_STEP(); TRACE_AND_STEP();
srcval = fetch_data_word(srcoffset); srcval = fetch_data_word(srcoffset);
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
assert(dstreg);
for (*dstreg = 0; *dstreg < 16; (*dstreg)++) for (*dstreg = 0; *dstreg < 16; (*dstreg)++)
if ((srcval >> *dstreg) & 1) if ((srcval >> *dstreg) & 1)
break; break;
@ -2328,6 +2442,7 @@ x86emuOp2_bsf(u8 X86EMU_UNUSED(op2))
TRACE_AND_STEP(); TRACE_AND_STEP();
srcval = fetch_data_long(srcoffset); srcval = fetch_data_long(srcoffset);
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
assert(dstreg);
for (*dstreg = 0; *dstreg < 32; (*dstreg)++) for (*dstreg = 0; *dstreg < 32; (*dstreg)++)
if ((srcval >> *dstreg) & 1) if ((srcval >> *dstreg) & 1)
break; break;
@ -2341,6 +2456,7 @@ x86emuOp2_bsf(u8 X86EMU_UNUSED(op2))
TRACE_AND_STEP(); TRACE_AND_STEP();
srcval = fetch_data_word(srcoffset); srcval = fetch_data_word(srcoffset);
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
assert(dstreg);
for (*dstreg = 0; *dstreg < 16; (*dstreg)++) for (*dstreg = 0; *dstreg < 16; (*dstreg)++)
if ((srcval >> *dstreg) & 1) if ((srcval >> *dstreg) & 1)
break; break;
@ -2348,25 +2464,27 @@ x86emuOp2_bsf(u8 X86EMU_UNUSED(op2))
break; break;
case 3: /* register to register */ case 3: /* register to register */
if (M.x86.mode & SYSMODE_PREFIX_DATA) { if (M.x86.mode & SYSMODE_PREFIX_DATA) {
u32 srcval, *dstreg; u32* dec = DECODE_RM_LONG_REGISTER(rl);
assert(dec);
srcval = *DECODE_RM_LONG_REGISTER(rl); u32 srcval = *dec;
DECODE_PRINTF(","); DECODE_PRINTF(",");
dstreg = DECODE_RM_LONG_REGISTER(rh); u32 *dstreg = DECODE_RM_LONG_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
assert(dstreg);
for (*dstreg = 0; *dstreg < 32; (*dstreg)++) for (*dstreg = 0; *dstreg < 32; (*dstreg)++)
if ((srcval >> *dstreg) & 1) if ((srcval >> *dstreg) & 1)
break; break;
} }
else { else {
u16 srcval, *dstreg; u16 *dec = DECODE_RM_WORD_REGISTER(rl);
assert(dec);
srcval = *DECODE_RM_WORD_REGISTER(rl); u16 srcval = *DECODE_RM_WORD_REGISTER(rl);
DECODE_PRINTF(","); DECODE_PRINTF(",");
dstreg = DECODE_RM_WORD_REGISTER(rh); u16 *dstreg = DECODE_RM_WORD_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
assert(dstreg);
for (*dstreg = 0; *dstreg < 16; (*dstreg)++) for (*dstreg = 0; *dstreg < 16; (*dstreg)++)
if ((srcval >> *dstreg) & 1) if ((srcval >> *dstreg) & 1)
break; break;
@ -2401,6 +2519,7 @@ x86emuOp2_bsr(u8 X86EMU_UNUSED(op2))
TRACE_AND_STEP(); TRACE_AND_STEP();
srcval = fetch_data_long(srcoffset); srcval = fetch_data_long(srcoffset);
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
assert(dstreg);
for (*dstreg = 31; *dstreg > 0; (*dstreg)--) for (*dstreg = 31; *dstreg > 0; (*dstreg)--)
if ((srcval >> *dstreg) & 1) if ((srcval >> *dstreg) & 1)
break; break;
@ -2414,6 +2533,7 @@ x86emuOp2_bsr(u8 X86EMU_UNUSED(op2))
TRACE_AND_STEP(); TRACE_AND_STEP();
srcval = fetch_data_word(srcoffset); srcval = fetch_data_word(srcoffset);
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
assert(dstreg);
for (*dstreg = 15; *dstreg > 0; (*dstreg)--) for (*dstreg = 15; *dstreg > 0; (*dstreg)--)
if ((srcval >> *dstreg) & 1) if ((srcval >> *dstreg) & 1)
break; break;
@ -2429,6 +2549,7 @@ x86emuOp2_bsr(u8 X86EMU_UNUSED(op2))
TRACE_AND_STEP(); TRACE_AND_STEP();
srcval = fetch_data_long(srcoffset); srcval = fetch_data_long(srcoffset);
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
assert(dstreg);
for (*dstreg = 31; *dstreg > 0; (*dstreg)--) for (*dstreg = 31; *dstreg > 0; (*dstreg)--)
if ((srcval >> *dstreg) & 1) if ((srcval >> *dstreg) & 1)
break; break;
@ -2442,6 +2563,7 @@ x86emuOp2_bsr(u8 X86EMU_UNUSED(op2))
TRACE_AND_STEP(); TRACE_AND_STEP();
srcval = fetch_data_word(srcoffset); srcval = fetch_data_word(srcoffset);
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
assert(dstreg);
for (*dstreg = 15; *dstreg > 0; (*dstreg)--) for (*dstreg = 15; *dstreg > 0; (*dstreg)--)
if ((srcval >> *dstreg) & 1) if ((srcval >> *dstreg) & 1)
break; break;
@ -2457,6 +2579,7 @@ x86emuOp2_bsr(u8 X86EMU_UNUSED(op2))
TRACE_AND_STEP(); TRACE_AND_STEP();
srcval = fetch_data_long(srcoffset); srcval = fetch_data_long(srcoffset);
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
assert(dstreg);
for (*dstreg = 31; *dstreg > 0; (*dstreg)--) for (*dstreg = 31; *dstreg > 0; (*dstreg)--)
if ((srcval >> *dstreg) & 1) if ((srcval >> *dstreg) & 1)
break; break;
@ -2470,6 +2593,7 @@ x86emuOp2_bsr(u8 X86EMU_UNUSED(op2))
TRACE_AND_STEP(); TRACE_AND_STEP();
srcval = fetch_data_word(srcoffset); srcval = fetch_data_word(srcoffset);
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
assert(dstreg);
for (*dstreg = 15; *dstreg > 0; (*dstreg)--) for (*dstreg = 15; *dstreg > 0; (*dstreg)--)
if ((srcval >> *dstreg) & 1) if ((srcval >> *dstreg) & 1)
break; break;
@ -2477,25 +2601,27 @@ x86emuOp2_bsr(u8 X86EMU_UNUSED(op2))
break; break;
case 3: /* register to register */ case 3: /* register to register */
if (M.x86.mode & SYSMODE_PREFIX_DATA) { if (M.x86.mode & SYSMODE_PREFIX_DATA) {
u32 srcval, *dstreg; u32 *dec = DECODE_RM_LONG_REGISTER(rl);
assert(dec);
srcval = *DECODE_RM_LONG_REGISTER(rl); u32 srcval = *dec;
DECODE_PRINTF(","); DECODE_PRINTF(",");
dstreg = DECODE_RM_LONG_REGISTER(rh); u32 *dstreg = DECODE_RM_LONG_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
assert(dstreg);
for (*dstreg = 31; *dstreg > 0; (*dstreg)--) for (*dstreg = 31; *dstreg > 0; (*dstreg)--)
if ((srcval >> *dstreg) & 1) if ((srcval >> *dstreg) & 1)
break; break;
} }
else { else {
u16 srcval, *dstreg; u16 *dec = DECODE_RM_WORD_REGISTER(rl);
assert(dec);
srcval = *DECODE_RM_WORD_REGISTER(rl); u16 srcval = *dec;
DECODE_PRINTF(","); DECODE_PRINTF(",");
dstreg = DECODE_RM_WORD_REGISTER(rh); u16 *dstreg = DECODE_RM_WORD_REGISTER(rh);
TRACE_AND_STEP(); TRACE_AND_STEP();
CONDITIONAL_SET_FLAG(srcval == 0, F_ZF); CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
assert(dstreg);
for (*dstreg = 15; *dstreg > 0; (*dstreg)--) for (*dstreg = 15; *dstreg > 0; (*dstreg)--)
if ((srcval >> *dstreg) & 1) if ((srcval >> *dstreg) & 1)
break; break;
@ -2543,6 +2669,7 @@ x86emuOp2_movsx_byte_R_RM(u8 X86EMU_UNUSED(op2))
srcval = (s16) ((s8) fetch_data_byte(srcoffset)); srcval = (s16) ((s8) fetch_data_byte(srcoffset));
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
*destreg = srcval; *destreg = srcval;
} }
break; break;
@ -2557,6 +2684,7 @@ x86emuOp2_movsx_byte_R_RM(u8 X86EMU_UNUSED(op2))
srcval = (s32) ((s8) fetch_data_byte(srcoffset)); srcval = (s32) ((s8) fetch_data_byte(srcoffset));
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
*destreg = srcval; *destreg = srcval;
} }
else { else {
@ -2569,6 +2697,7 @@ x86emuOp2_movsx_byte_R_RM(u8 X86EMU_UNUSED(op2))
srcval = (s16) ((s8) fetch_data_byte(srcoffset)); srcval = (s16) ((s8) fetch_data_byte(srcoffset));
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
*destreg = srcval; *destreg = srcval;
} }
break; break;
@ -2583,6 +2712,7 @@ x86emuOp2_movsx_byte_R_RM(u8 X86EMU_UNUSED(op2))
srcval = (s32) ((s8) fetch_data_byte(srcoffset)); srcval = (s32) ((s8) fetch_data_byte(srcoffset));
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
*destreg = srcval; *destreg = srcval;
} }
else { else {
@ -2595,6 +2725,7 @@ x86emuOp2_movsx_byte_R_RM(u8 X86EMU_UNUSED(op2))
srcval = (s16) ((s8) fetch_data_byte(srcoffset)); srcval = (s16) ((s8) fetch_data_byte(srcoffset));
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
*destreg = srcval; *destreg = srcval;
} }
break; break;
@ -2604,8 +2735,10 @@ x86emuOp2_movsx_byte_R_RM(u8 X86EMU_UNUSED(op2))
u8 *srcreg; u8 *srcreg;
destreg = DECODE_RM_LONG_REGISTER(rh); destreg = DECODE_RM_LONG_REGISTER(rh);
assert(destreg);
DECODE_PRINTF(","); DECODE_PRINTF(",");
srcreg = DECODE_RM_BYTE_REGISTER(rl); srcreg = DECODE_RM_BYTE_REGISTER(rl);
assert(srcreg);
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
*destreg = (s32) ((s8) * srcreg); *destreg = (s32) ((s8) * srcreg);
@ -2615,8 +2748,10 @@ x86emuOp2_movsx_byte_R_RM(u8 X86EMU_UNUSED(op2))
u8 *srcreg; u8 *srcreg;
destreg = DECODE_RM_WORD_REGISTER(rh); destreg = DECODE_RM_WORD_REGISTER(rh);
assert(destreg);
DECODE_PRINTF(","); DECODE_PRINTF(",");
srcreg = DECODE_RM_BYTE_REGISTER(rl); srcreg = DECODE_RM_BYTE_REGISTER(rl);
assert(srcreg);
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
*destreg = (s16) ((s8) * srcreg); *destreg = (s16) ((s8) * srcreg);
@ -2651,6 +2786,7 @@ x86emuOp2_movsx_word_R_RM(u8 X86EMU_UNUSED(op2))
srcval = (s32) ((s16) fetch_data_word(srcoffset)); srcval = (s32) ((s16) fetch_data_word(srcoffset));
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
*destreg = srcval; *destreg = srcval;
break; break;
case 1: case 1:
@ -2660,6 +2796,7 @@ x86emuOp2_movsx_word_R_RM(u8 X86EMU_UNUSED(op2))
srcval = (s32) ((s16) fetch_data_word(srcoffset)); srcval = (s32) ((s16) fetch_data_word(srcoffset));
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
*destreg = srcval; *destreg = srcval;
break; break;
case 2: case 2:
@ -2669,12 +2806,15 @@ x86emuOp2_movsx_word_R_RM(u8 X86EMU_UNUSED(op2))
srcval = (s32) ((s16) fetch_data_word(srcoffset)); srcval = (s32) ((s16) fetch_data_word(srcoffset));
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
assert(destreg);
*destreg = srcval; *destreg = srcval;
break; break;
case 3: /* register to register */ case 3: /* register to register */
destreg = DECODE_RM_LONG_REGISTER(rh); destreg = DECODE_RM_LONG_REGISTER(rh);
assert(destreg);
DECODE_PRINTF(","); DECODE_PRINTF(",");
srcreg = DECODE_RM_WORD_REGISTER(rl); srcreg = DECODE_RM_WORD_REGISTER(rl);
assert(srcreg);
DECODE_PRINTF("\n"); DECODE_PRINTF("\n");
TRACE_AND_STEP(); TRACE_AND_STEP();
*destreg = (s32) ((s16) * srcreg); *destreg = (s32) ((s16) * srcreg);