Revision c0a04f0e
b/target-i386/op_helper.c | ||
---|---|---|
590 | 590 |
#define SET_ESP(val, sp_mask) ESP = (ESP & ~(sp_mask)) | ((val) & (sp_mask)) |
591 | 591 |
#endif |
592 | 592 |
|
593 |
/* in 64-bit machines, this can overflow. So this segment addition macro |
|
594 |
* can be used to trim the value to 32-bit whenever needed */ |
|
595 |
#define SEG_ADDL(ssp, sp, sp_mask) ((uint32_t)((ssp) + (sp & (sp_mask)))) |
|
596 |
|
|
593 | 597 |
/* XXX: add a is_user flag to have proper security support */ |
594 | 598 |
#define PUSHW(ssp, sp, sp_mask, val)\ |
595 | 599 |
{\ |
... | ... | |
600 | 604 |
#define PUSHL(ssp, sp, sp_mask, val)\ |
601 | 605 |
{\ |
602 | 606 |
sp -= 4;\ |
603 |
stl_kernel((ssp) + (sp & (sp_mask)), (val));\
|
|
607 |
stl_kernel(SEG_ADDL(ssp, sp, sp_mask), (uint32_t)(val));\
|
|
604 | 608 |
} |
605 | 609 |
|
606 | 610 |
#define POPW(ssp, sp, sp_mask, val)\ |
... | ... | |
611 | 615 |
|
612 | 616 |
#define POPL(ssp, sp, sp_mask, val)\ |
613 | 617 |
{\ |
614 |
val = (uint32_t)ldl_kernel((ssp) + (sp & (sp_mask)));\
|
|
618 |
val = (uint32_t)ldl_kernel(SEG_ADDL(ssp, sp, sp_mask));\
|
|
615 | 619 |
sp += 4;\ |
616 | 620 |
} |
617 | 621 |
|
Also available in: Unified diff