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