|
|
| version 1.33, 2012/01/08 19:09:40 | version 1.34, 2012/02/05 22:19:47 |
|---|---|
| Line 46 check_limit_upstairs(descriptor_t *sdp, | Line 46 check_limit_upstairs(descriptor_t *sdp, |
| len--; | len--; |
| end = offset + len; | end = offset + len; |
| limit = SEG_IS_32BIT(sdp) ? 0xffffffff : 0x0000ffff; | |
| if (SEG_IS_DATA(sdp) && SEG_IS_EXPANDDOWN_DATA(sdp)) { | if (SEG_IS_DATA(sdp) && SEG_IS_EXPANDDOWN_DATA(sdp)) { |
| /* expand-down data segment */ | /* expand-down data segment */ |
| limit = SEG_IS_32BIT(sdp) ? 0xffffffff : 0x0000ffff; | |
| if (sdp->u.seg.limit == 0) { | if (sdp->u.seg.limit == 0) { |
| /* | /* |
| * 32bit 16bit | * 32bit 16bit |
| Line 93 check_limit_upstairs(descriptor_t *sdp, | Line 93 check_limit_upstairs(descriptor_t *sdp, |
| } | } |
| } else { | } else { |
| /* expand-up data or code segment */ | /* expand-up data or code segment */ |
| if (sdp->u.seg.limit == limit) { | if (sdp->u.seg.limit == 0xffffffff) { |
| /* | /* |
| * 32bit 16bit | * 16/32bit |
| * +-------+ +-------+ FFFFFFFFh | * +-------+ FFFFFFFFh |
| * | | | | | * | | |
| * | | + [1] + 0000FFFFh | * | | |
| * | valid | | | | * | valid | |
| * | | +-------+ 0000FFFFh - len - 1 | * | | |
| * | | | valid | | * | | |
| * +-------+ +-------+ 00000000h | * +-------+ 00000000h |
| */ | */ |
| if (!SEG_IS_32BIT(sdp)) { | sdp->flag |= CPU_DESC_FLAG_WHOLEADR; |
| if ((len > limit) /* len check */ | |
| || (offset + len > limit)) { /* [1] */ | |
| goto exc; | |
| } | |
| } else { | |
| sdp->flag |= CPU_DESC_FLAG_WHOLEADR; | |
| } | |
| } else { | } else { |
| /* | /* |
| * 32bit 16bit | * 16/32bit |
| * +-------+ +-------+ FFFFFFFFh | * +-------+ FFFFFFFFh |
| * | | | | | * | | |
| * | | +.......+ 0000FFFFh | * | | |
| * | [1] | | [1] | | * | [1] | |
| * +.......+ +.......+ seg.limit | * +.......+ seg.limit |
| * | | | | | * | | |
| * +-------+ +-------+ seg.limit - len - 1 | * +-------+ seg.limit - len - 1 |
| * | valid | | valid | | * | valid | |
| * +-------+ +-------+ 00000000h | * +-------+ 00000000h |
| */ | */ |
| if ((len > sdp->u.seg.limit) /* len check */ | if ((len > sdp->u.seg.limit) /* len check */ |
| || (end < offset) /* wrap check */ | || (end < offset) /* wrap check */ |