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

View File

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

View File

@ -898,13 +898,15 @@ xf86NameCmp(const char *s1, const char *s2)
char *
xf86NormalizeName(const char *s)
{
char *ret, *q;
char *q;
const char *p;
if (s == 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++) {
switch (*p) {
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);
return -1;
}

View File

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

View File

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

View File

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

View File

@ -834,8 +834,6 @@ VBESetGetPaletteData(vbeInfoPtr pVbe, Bool set, int first, int num,
VBEpmi *
VBEGetVBEpmi(vbeInfoPtr pVbe)
{
VBEpmi *pmi;
/*
Input:
AH := 4Fh Super VGA support
@ -859,7 +857,10 @@ VBEGetVBEpmi(vbeInfoPtr pVbe)
if (R16(pVbe->pInt10->ax) != 0x4f)
return NULL;
pmi = malloc(sizeof(VBEpmi));
VBEpmi *pmi = calloc(1, sizeof(VBEpmi));
if (!pmi)
return NULL;
pmi->seg_tbl = R16(pVbe->pInt10->es);
pmi->tbl_off = R16(pVbe->pInt10->di);
pmi->tbl_len = R16(pVbe->pInt10->cx);
@ -936,7 +937,8 @@ VBEVesaSaveRestore(vbeInfoPtr pVbe, vbeSaveRestorePtr vbe_sr,
vbe_sr->stateMode = -1; /* invalidate */
/* don't rely on the memory not being touched */
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);
}
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",
(int) pMode->VRefresh, pMode->name, data->mode);
data->block = calloc(1, sizeof(VbeCRTCInfoBlock));
if (!data->block)
continue;
data->block->HorizontalTotal = best->HTotal;
data->block->HorizontalSyncStart = best->HSyncStart;
data->block->HorizontalSyncEnd = best->HSyncEnd;

View File

@ -702,6 +702,8 @@ LoadModule(const char *module, void *options, const XF86ModReqInfo *modreq,
if (!strcmp(m, "vbe"))
m = name = strdup("int10");
assert(m);
for (cim = compiled_in_modules; *cim; cim++)
if (!strcmp(m, *cim)) {
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 P0 - V0) / W0
*/
double r[3];
double q[2], u[2], t[2], v[2], w[2], p[2];
double r[3] = { 0 };
double q[2], u[2], t[2], v[2], w[2] = { 0 }, p[2];
double f;
struct pixman_f_vector d;
struct pixman_f_vector d = { 0 };
int i;
/* Get the un-normalized crtc coordinates again */

View File

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

View File

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

View File

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

View File

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

View File

@ -57,10 +57,13 @@ xf86freeOutputClassList(XF86ConfOutputClassPtr ptr)
TestFree(ptr->modulepath);
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);
*list = NULL;
}
xorg_list_del(&group->entry);
free(group);
group = NULL;
}
xf86optionListFree(ptr->option_lst);

View File

@ -569,7 +569,6 @@ static char *
DoSubstitution(const char *template, const char *cmdline, const char *projroot,
int *cmdlineUsed, int *envUsed, const char *XConfigFile)
{
char *result;
int i, l;
static const char *env = NULL;
static char *hostname = NULL;
@ -582,7 +581,10 @@ DoSubstitution(const char *template, const char *cmdline, const char *projroot,
if (envUsed)
*envUsed = 0;
result = malloc(PATH_MAX + 1);
char *result = calloc(1, PATH_MAX + 1);
if (!result)
return NULL;
l = 0;
for (i = 0; template[i]; 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 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
* pixels requested is first processed to ensure that it is divisible
@ -604,6 +606,8 @@ parse_command_line(int argc, char *argv[])
int n;
options *o = (options *) calloc(1, sizeof(options));
if (!o)
goto bad_option;
if (argc < 4)
goto bad_option;

View File

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