Revision 61a8c4ec target-i386/helper.c

b/target-i386/helper.c
1068 1068
    }
1069 1069
}
1070 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

  
1071 1103
void helper_lldt_T0(void)
1072 1104
{
1073 1105
    int selector;

Also available in: Unified diff