1068 |
} |
} |
1069 |
} |
} |
1070 |
|
|
1071 |
|
void helper_enter_level(int level, int data32) |
1072 |
|
{ |
1073 |
|
uint8_t *ssp; |
1074 |
|
uint32_t esp_mask, esp, ebp; |
1075 |
|
|
1076 |
|
esp_mask = get_sp_mask(env->segs[R_SS].flags); |
1077 |
|
ssp = env->segs[R_SS].base; |
1078 |
|
ebp = EBP; |
1079 |
|
esp = ESP; |
1080 |
|
if (data32) { |
1081 |
|
/* 32 bit */ |
1082 |
|
esp -= 4; |
1083 |
|
while (--level) { |
1084 |
|
esp -= 4; |
1085 |
|
ebp -= 4; |
1086 |
|
stl(ssp + (esp & esp_mask), ldl(ssp + (ebp & esp_mask))); |
1087 |
|
} |
1088 |
|
esp -= 4; |
1089 |
|
stl(ssp + (esp & esp_mask), T1); |
1090 |
|
} else { |
1091 |
|
/* 16 bit */ |
1092 |
|
esp -= 2; |
1093 |
|
while (--level) { |
1094 |
|
esp -= 2; |
1095 |
|
ebp -= 2; |
1096 |
|
stw(ssp + (esp & esp_mask), lduw(ssp + (ebp & esp_mask))); |
1097 |
|
} |
1098 |
|
esp -= 2; |
1099 |
|
stw(ssp + (esp & esp_mask), T1); |
1100 |
|
} |
1101 |
|
} |
1102 |
|
|
1103 |
void helper_lldt_T0(void) |
void helper_lldt_T0(void) |
1104 |
{ |
{ |
1105 |
int selector; |
int selector; |