|
|
| version 1.25, 2012/01/08 08:02:50 | version 1.27, 2012/01/08 08:19:22 |
|---|---|
| Line 218 exc: | Line 218 exc: |
| EXCEPTION(e, 0); | EXCEPTION(e, 0); |
| } | } |
| void | void MEMCALL |
| cpu_stack_push_check(UINT16 s, descriptor_t *sdp, UINT32 sp, UINT len) | cpu_stack_push_check(UINT16 s, descriptor_t *sdp, UINT32 sp, UINT len) |
| { | { |
| UINT32 limit; | UINT32 limit; |
| Line 238 cpu_stack_push_check(UINT16 s, descripto | Line 238 cpu_stack_push_check(UINT16 s, descripto |
| len--; | len--; |
| start = sp - len; | start = sp - len; |
| limit = SEG_IS_32BIT(sdp) ? 0xffffffff : 0x0000ffff; | limit = SEG_IS_32BIT(sdp) ? 0xffffffff : 0x0000ffff; |
| VERBOSE(("cpu_stack_push_check: start=0x%08x, limit=0x%08x", start, limit)); | |
| if (SEG_IS_EXPANDDOWN_DATA(sdp)) { | if (SEG_IS_EXPANDDOWN_DATA(sdp)) { |
| /* expand-down stack */ | /* expand-down stack */ |
| VERBOSE(("cpu_stack_push_check: expand-down stack")); | |
| if (!SEG_IS_32BIT(sdp)) { | if (!SEG_IS_32BIT(sdp)) { |
| if (sp > limit) { /* [*] */ | if (sp > limit) { /* [*] */ |
| goto exc; | goto exc; |
| Line 287 cpu_stack_push_check(UINT16 s, descripto | Line 285 cpu_stack_push_check(UINT16 s, descripto |
| } | } |
| } else { | } else { |
| /* expand-up stack */ | /* expand-up stack */ |
| VERBOSE(("cpu_stack_push_check: expand-up stack")); | |
| if (sdp->u.seg.limit == limit) { | if (sdp->u.seg.limit == limit) { |
| /* | /* |
| * 32bit 16bit | * 32bit 16bit |
| Line 323 cpu_stack_push_check(UINT16 s, descripto | Line 320 cpu_stack_push_check(UINT16 s, descripto |
| */ | */ |
| if ((len > sdp->u.seg.limit) /* len check */ | if ((len > sdp->u.seg.limit) /* len check */ |
| || (start > sp) /* wrap check */ | || (start > sp) /* wrap check */ |
| || (sp > sdp->u.seg.limit)) { /* [1] */ | || (sp > sdp->u.seg.limit + 1)) { /* [1] */ |
| goto exc; | goto exc; |
| } | } |
| } | } |
| Line 339 exc: | Line 336 exc: |
| EXCEPTION(SS_EXCEPTION, s & 0xfffc); | EXCEPTION(SS_EXCEPTION, s & 0xfffc); |
| } | } |
| void | void MEMCALL |
| cpu_stack_pop_check(UINT16 s, descriptor_t *sdp, UINT32 sp, UINT len) | cpu_stack_pop_check(UINT16 s, descriptor_t *sdp, UINT32 sp, UINT len) |
| { | { |