Revision 5516d670

b/target-i386/helper.c
2335 2335
void helper_lsl(void)
2336 2336
{
2337 2337
    unsigned int selector, limit;
2338
    uint32_t e1, e2;
2338
    uint32_t e1, e2, eflags;
2339 2339
    int rpl, dpl, cpl, type;
2340 2340

  
2341
    CC_SRC = cc_table[CC_OP].compute_all() & ~CC_Z;
2341
    eflags = cc_table[CC_OP].compute_all();
2342 2342
    selector = T0 & 0xffff;
2343 2343
    if (load_segment(&e1, &e2, selector) != 0)
2344
        return;
2344
        goto fail;
2345 2345
    rpl = selector & 3;
2346 2346
    dpl = (e2 >> DESC_DPL_SHIFT) & 3;
2347 2347
    cpl = env->hflags & HF_CPL_MASK;
......
2350 2350
            /* conforming */
2351 2351
        } else {
2352 2352
            if (dpl < cpl || dpl < rpl)
2353
                return;
2353
                goto fail;
2354 2354
        }
2355 2355
    } else {
2356 2356
        type = (e2 >> DESC_TYPE_SHIFT) & 0xf;
......
2362 2362
        case 11:
2363 2363
            break;
2364 2364
        default:
2365
            return;
2365
            goto fail;
2366 2366
        }
2367
        if (dpl < cpl || dpl < rpl)
2367
        if (dpl < cpl || dpl < rpl) {
2368
        fail:
2369
            CC_SRC = eflags & ~CC_Z;
2368 2370
            return;
2371
        }
2369 2372
    }
2370 2373
    limit = get_seg_limit(e1, e2);
2371 2374
    T1 = limit;
2372
    CC_SRC |= CC_Z;
2375
    CC_SRC = eflags | CC_Z;
2373 2376
}
2374 2377

  
2375 2378
void helper_lar(void)
2376 2379
{
2377 2380
    unsigned int selector;
2378
    uint32_t e1, e2;
2381
    uint32_t e1, e2, eflags;
2379 2382
    int rpl, dpl, cpl, type;
2380 2383

  
2381
    CC_SRC = cc_table[CC_OP].compute_all() & ~CC_Z;
2384
    eflags = cc_table[CC_OP].compute_all();
2382 2385
    selector = T0 & 0xffff;
2383 2386
    if ((selector & 0xfffc) == 0)
2384
        return;
2387
        goto fail;
2385 2388
    if (load_segment(&e1, &e2, selector) != 0)
2386
        return;
2389
        goto fail;
2387 2390
    rpl = selector & 3;
2388 2391
    dpl = (e2 >> DESC_DPL_SHIFT) & 3;
2389 2392
    cpl = env->hflags & HF_CPL_MASK;
......
2392 2395
            /* conforming */
2393 2396
        } else {
2394 2397
            if (dpl < cpl || dpl < rpl)
2395
                return;
2398
                goto fail;
2396 2399
        }
2397 2400
    } else {
2398 2401
        type = (e2 >> DESC_TYPE_SHIFT) & 0xf;
......
2407 2410
        case 12:
2408 2411
            break;
2409 2412
        default:
2410
            return;
2413
            goto fail;
2411 2414
        }
2412
        if (dpl < cpl || dpl < rpl)
2415
        if (dpl < cpl || dpl < rpl) {
2416
        fail:
2417
            CC_SRC = eflags & ~CC_Z;
2413 2418
            return;
2419
        }
2414 2420
    }
2415 2421
    T1 = e2 & 0x00f0ff00;
2416
    CC_SRC |= CC_Z;
2422
    CC_SRC = eflags | CC_Z;
2417 2423
}
2418 2424

  
2419 2425
void helper_verr(void)
2420 2426
{
2421 2427
    unsigned int selector;
2422
    uint32_t e1, e2;
2428
    uint32_t e1, e2, eflags;
2423 2429
    int rpl, dpl, cpl;
2424 2430

  
2425
    CC_SRC = cc_table[CC_OP].compute_all() & ~CC_Z;
2431
    eflags = cc_table[CC_OP].compute_all();
2426 2432
    selector = T0 & 0xffff;
2427 2433
    if ((selector & 0xfffc) == 0)
2428
        return;
2434
        goto fail;
2429 2435
    if (load_segment(&e1, &e2, selector) != 0)
2430
        return;
2436
        goto fail;
2431 2437
    if (!(e2 & DESC_S_MASK))
2432
        return;
2438
        goto fail;
2433 2439
    rpl = selector & 3;
2434 2440
    dpl = (e2 >> DESC_DPL_SHIFT) & 3;
2435 2441
    cpl = env->hflags & HF_CPL_MASK;
2436 2442
    if (e2 & DESC_CS_MASK) {
2437 2443
        if (!(e2 & DESC_R_MASK))
2438
            return;
2444
            goto fail;
2439 2445
        if (!(e2 & DESC_C_MASK)) {
2440 2446
            if (dpl < cpl || dpl < rpl)
2441
                return;
2447
                goto fail;
2442 2448
        }
2443 2449
    } else {
2444
        if (dpl < cpl || dpl < rpl)
2450
        if (dpl < cpl || dpl < rpl) {
2451
        fail:
2452
            CC_SRC = eflags & ~CC_Z;
2445 2453
            return;
2454
        }
2446 2455
    }
2447
    CC_SRC |= CC_Z;
2456
    CC_SRC = eflags | CC_Z;
2448 2457
}
2449 2458

  
2450 2459
void helper_verw(void)
2451 2460
{
2452 2461
    unsigned int selector;
2453
    uint32_t e1, e2;
2462
    uint32_t e1, e2, eflags;
2454 2463
    int rpl, dpl, cpl;
2455 2464

  
2456
    CC_SRC = cc_table[CC_OP].compute_all() & ~CC_Z;
2465
    eflags = cc_table[CC_OP].compute_all();
2457 2466
    selector = T0 & 0xffff;
2458 2467
    if ((selector & 0xfffc) == 0)
2459
        return;
2468
        goto fail;
2460 2469
    if (load_segment(&e1, &e2, selector) != 0)
2461
        return;
2470
        goto fail;
2462 2471
    if (!(e2 & DESC_S_MASK))
2463
        return;
2472
        goto fail;
2464 2473
    rpl = selector & 3;
2465 2474
    dpl = (e2 >> DESC_DPL_SHIFT) & 3;
2466 2475
    cpl = env->hflags & HF_CPL_MASK;
2467 2476
    if (e2 & DESC_CS_MASK) {
2468
        return;
2477
        goto fail;
2469 2478
    } else {
2470 2479
        if (dpl < cpl || dpl < rpl)
2480
            goto fail;
2481
        if (!(e2 & DESC_W_MASK)) {
2482
        fail:
2483
            CC_SRC = eflags & ~CC_Z;
2471 2484
            return;
2472
        if (!(e2 & DESC_W_MASK))
2473
            return;
2485
        }
2474 2486
    }
2475
    CC_SRC |= CC_Z;
2487
    CC_SRC = eflags | CC_Z;
2476 2488
}
2477 2489

  
2478 2490
/* FPU helpers */

Also available in: Unified diff