| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: t_ptrace_x86_wait.h,v 1.30 2020/10/24 07:14:30 mgorny Exp $ */ | | 1 | /* $NetBSD: t_ptrace_x86_wait.h,v 1.31 2020/10/27 08:32:36 mgorny Exp $ */ |
2 | | | 2 | |
3 | /*- | | 3 | /*- |
4 | * Copyright (c) 2016, 2017, 2018, 2019 The NetBSD Foundation, Inc. | | 4 | * Copyright (c) 2016, 2017, 2018, 2019 The NetBSD Foundation, Inc. |
5 | * All rights reserved. | | 5 | * All rights reserved. |
6 | * | | 6 | * |
7 | * Redistribution and use in source and binary forms, with or without | | 7 | * Redistribution and use in source and binary forms, with or without |
8 | * modification, are permitted provided that the following conditions | | 8 | * modification, are permitted provided that the following conditions |
9 | * are met: | | 9 | * are met: |
10 | * 1. Redistributions of source code must retain the above copyright | | 10 | * 1. Redistributions of source code must retain the above copyright |
11 | * notice, this list of conditions and the following disclaimer. | | 11 | * notice, this list of conditions and the following disclaimer. |
12 | * 2. Redistributions in binary form must reproduce the above copyright | | 12 | * 2. Redistributions in binary form must reproduce the above copyright |
13 | * notice, this list of conditions and the following disclaimer in the | | 13 | * notice, this list of conditions and the following disclaimer in the |
14 | * documentation and/or other materials provided with the distribution. | | 14 | * documentation and/or other materials provided with the distribution. |
| @@ -2167,26 +2167,29 @@ ATF_TC_BODY(x86_cve_2018_8897, tc) | | | @@ -2167,26 +2167,29 @@ ATF_TC_BODY(x86_cve_2018_8897, tc) |
2167 | DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); | | 2167 | DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); |
2168 | TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); | | 2168 | TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); |
2169 | | | 2169 | |
2170 | validate_status_signaled(status, SIGKILL, 0); | | 2170 | validate_status_signaled(status, SIGKILL, 0); |
2171 | | | 2171 | |
2172 | DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); | | 2172 | DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); |
2173 | TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); | | 2173 | TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0)); |
2174 | } | | 2174 | } |
2175 | | | 2175 | |
2176 | /// ---------------------------------------------------------------------------- | | 2176 | /// ---------------------------------------------------------------------------- |
2177 | | | 2177 | |
2178 | union x86_test_register { | | 2178 | union x86_test_register { |
2179 | struct { | | 2179 | struct { |
| | | 2180 | uint64_t a, b, c, d, e, f, g, h; |
| | | 2181 | } zmm; |
| | | 2182 | struct { |
2180 | uint64_t a, b, c, d; | | 2183 | uint64_t a, b, c, d; |
2181 | } ymm; | | 2184 | } ymm; |
2182 | struct { | | 2185 | struct { |
2183 | uint64_t a, b; | | 2186 | uint64_t a, b; |
2184 | } xmm; | | 2187 | } xmm; |
2185 | uint64_t u64; | | 2188 | uint64_t u64; |
2186 | uint32_t u32; | | 2189 | uint32_t u32; |
2187 | }; | | 2190 | }; |
2188 | | | 2191 | |
2189 | struct x86_test_fpu_registers { | | 2192 | struct x86_test_fpu_registers { |
2190 | struct { | | 2193 | struct { |
2191 | uint64_t mantissa; | | 2194 | uint64_t mantissa; |
2192 | uint16_t sign_exp; | | 2195 | uint16_t sign_exp; |
| @@ -2210,27 +2213,28 @@ enum x86_test_regset { | | | @@ -2210,27 +2213,28 @@ enum x86_test_regset { |
2210 | | | 2213 | |
2211 | /* Please keep them grouped by acceptable x86_test_regset. */ | | 2214 | /* Please keep them grouped by acceptable x86_test_regset. */ |
2212 | enum x86_test_registers { | | 2215 | enum x86_test_registers { |
2213 | /* TEST_GPREGS */ | | 2216 | /* TEST_GPREGS */ |
2214 | GPREGS_32, | | 2217 | GPREGS_32, |
2215 | GPREGS_32_EBP_ESP, | | 2218 | GPREGS_32_EBP_ESP, |
2216 | GPREGS_64, | | 2219 | GPREGS_64, |
2217 | GPREGS_64_R8, | | 2220 | GPREGS_64_R8, |
2218 | /* TEST_FPREGS/TEST_XMMREGS */ | | 2221 | /* TEST_FPREGS/TEST_XMMREGS */ |
2219 | FPREGS_FPU, | | 2222 | FPREGS_FPU, |
2220 | FPREGS_MM, | | 2223 | FPREGS_MM, |
2221 | FPREGS_XMM, | | 2224 | FPREGS_XMM, |
2222 | /* TEST_XSTATE */ | | 2225 | /* TEST_XSTATE */ |
2223 | FPREGS_YMM | | 2226 | FPREGS_YMM, |
| | | 2227 | FPREGS_ZMM |
2224 | }; | | 2228 | }; |
2225 | | | 2229 | |
2226 | enum x86_test_regmode { | | 2230 | enum x86_test_regmode { |
2227 | TEST_GETREGS, | | 2231 | TEST_GETREGS, |
2228 | TEST_SETREGS, | | 2232 | TEST_SETREGS, |
2229 | TEST_COREDUMP | | 2233 | TEST_COREDUMP |
2230 | }; | | 2234 | }; |
2231 | | | 2235 | |
2232 | static __inline void get_gp32_regs(union x86_test_register out[]) | | 2236 | static __inline void get_gp32_regs(union x86_test_register out[]) |
2233 | { | | 2237 | { |
2234 | #if defined(__i386__) | | 2238 | #if defined(__i386__) |
2235 | const uint32_t fill = 0x0F0F0F0F; | | 2239 | const uint32_t fill = 0x0F0F0F0F; |
2236 | | | 2240 | |
| @@ -2386,55 +2390,55 @@ static __inline void get_gp64_r8_regs(un | | | @@ -2386,55 +2390,55 @@ static __inline void get_gp64_r8_regs(un |
2386 | __asm__ __volatile__( | | 2390 | __asm__ __volatile__( |
2387 | /* fill registers with clobber pattern */ | | 2391 | /* fill registers with clobber pattern */ |
2388 | "movq %1, %%r8\n\t" | | 2392 | "movq %1, %%r8\n\t" |
2389 | "movq %1, %%r9\n\t" | | 2393 | "movq %1, %%r9\n\t" |
2390 | "movq %1, %%r10\n\t" | | 2394 | "movq %1, %%r10\n\t" |
2391 | "movq %1, %%r11\n\t" | | 2395 | "movq %1, %%r11\n\t" |
2392 | "movq %1, %%r12\n\t" | | 2396 | "movq %1, %%r12\n\t" |
2393 | "movq %1, %%r13\n\t" | | 2397 | "movq %1, %%r13\n\t" |
2394 | "movq %1, %%r14\n\t" | | 2398 | "movq %1, %%r14\n\t" |
2395 | "movq %1, %%r15\n\t" | | 2399 | "movq %1, %%r15\n\t" |
2396 | "\n\t" | | 2400 | "\n\t" |
2397 | "int3\n\t" | | 2401 | "int3\n\t" |
2398 | "\n\t" | | 2402 | "\n\t" |
2399 | "movq %%r8, 0x00(%0)\n\t" | | 2403 | "movq %%r8, 0x000(%0)\n\t" |
2400 | "movq %%r9, 0x20(%0)\n\t" | | 2404 | "movq %%r9, 0x040(%0)\n\t" |
2401 | "movq %%r10, 0x40(%0)\n\t" | | 2405 | "movq %%r10, 0x080(%0)\n\t" |
2402 | "movq %%r11, 0x60(%0)\n\t" | | 2406 | "movq %%r11, 0x0C0(%0)\n\t" |
2403 | "movq %%r12, 0x80(%0)\n\t" | | 2407 | "movq %%r12, 0x100(%0)\n\t" |
2404 | "movq %%r13, 0xA0(%0)\n\t" | | 2408 | "movq %%r13, 0x140(%0)\n\t" |
2405 | "movq %%r14, 0xC0(%0)\n\t" | | 2409 | "movq %%r14, 0x180(%0)\n\t" |
2406 | "movq %%r15, 0xE0(%0)\n\t" | | 2410 | "movq %%r15, 0x1C0(%0)\n\t" |
2407 | : | | 2411 | : |
2408 | : "a"(out), "m"(fill) | | 2412 | : "a"(out), "m"(fill) |
2409 | : "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" | | 2413 | : "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" |
2410 | ); | | 2414 | ); |
2411 | #else | | 2415 | #else |
2412 | __unreachable(); | | 2416 | __unreachable(); |
2413 | #endif | | 2417 | #endif |
2414 | } | | 2418 | } |
2415 | | | 2419 | |
2416 | static __inline void set_gp64_r8_regs(const union x86_test_register data[]) | | 2420 | static __inline void set_gp64_r8_regs(const union x86_test_register data[]) |
2417 | { | | 2421 | { |
2418 | #if defined(__x86_64__) | | 2422 | #if defined(__x86_64__) |
2419 | __asm__ __volatile__( | | 2423 | __asm__ __volatile__( |
2420 | "movq 0x00(%0), %%r8\n\t" | | 2424 | "movq 0x000(%0), %%r8\n\t" |
2421 | "movq 0x20(%0), %%r9\n\t" | | 2425 | "movq 0x040(%0), %%r9\n\t" |
2422 | "movq 0x40(%0), %%r10\n\t" | | 2426 | "movq 0x080(%0), %%r10\n\t" |
2423 | "movq 0x60(%0), %%r11\n\t" | | 2427 | "movq 0x0C0(%0), %%r11\n\t" |
2424 | "movq 0x80(%0), %%r12\n\t" | | 2428 | "movq 0x100(%0), %%r12\n\t" |
2425 | "movq 0xA0(%0), %%r13\n\t" | | 2429 | "movq 0x140(%0), %%r13\n\t" |
2426 | "movq 0xC0(%0), %%r14\n\t" | | 2430 | "movq 0x180(%0), %%r14\n\t" |
2427 | "movq 0xE0(%0), %%r15\n\t" | | 2431 | "movq 0x1C0(%0), %%r15\n\t" |
2428 | "int3\n\t" | | 2432 | "int3\n\t" |
2429 | : | | 2433 | : |
2430 | : "b"(data) | | 2434 | : "b"(data) |
2431 | : "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" | | 2435 | : "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" |
2432 | ); | | 2436 | ); |
2433 | #else | | 2437 | #else |
2434 | __unreachable(); | | 2438 | __unreachable(); |
2435 | #endif | | 2439 | #endif |
2436 | } | | 2440 | } |
2437 | | | 2441 | |
2438 | static __inline void get_fpu_regs(struct x86_test_fpu_registers *out) | | 2442 | static __inline void get_fpu_regs(struct x86_test_fpu_registers *out) |
2439 | { | | 2443 | { |
2440 | struct save87 fsave; | | 2444 | struct save87 fsave; |
| @@ -2516,52 +2520,52 @@ static __inline void get_mm_regs(union x | | | @@ -2516,52 +2520,52 @@ static __inline void get_mm_regs(union x |
2516 | __asm__ __volatile__( | | 2520 | __asm__ __volatile__( |
2517 | /* fill registers with clobber pattern */ | | 2521 | /* fill registers with clobber pattern */ |
2518 | "movq %1, %%mm0\n\t" | | 2522 | "movq %1, %%mm0\n\t" |
2519 | "movq %1, %%mm1\n\t" | | 2523 | "movq %1, %%mm1\n\t" |
2520 | "movq %1, %%mm2\n\t" | | 2524 | "movq %1, %%mm2\n\t" |
2521 | "movq %1, %%mm3\n\t" | | 2525 | "movq %1, %%mm3\n\t" |
2522 | "movq %1, %%mm4\n\t" | | 2526 | "movq %1, %%mm4\n\t" |
2523 | "movq %1, %%mm5\n\t" | | 2527 | "movq %1, %%mm5\n\t" |
2524 | "movq %1, %%mm6\n\t" | | 2528 | "movq %1, %%mm6\n\t" |
2525 | "movq %1, %%mm7\n\t" | | 2529 | "movq %1, %%mm7\n\t" |
2526 | "\n\t" | | 2530 | "\n\t" |
2527 | "int3\n\t" | | 2531 | "int3\n\t" |
2528 | "\n\t" | | 2532 | "\n\t" |
2529 | "movq %%mm0, 0x00(%0)\n\t" | | 2533 | "movq %%mm0, 0x000(%0)\n\t" |
2530 | "movq %%mm1, 0x20(%0)\n\t" | | 2534 | "movq %%mm1, 0x040(%0)\n\t" |
2531 | "movq %%mm2, 0x40(%0)\n\t" | | 2535 | "movq %%mm2, 0x080(%0)\n\t" |
2532 | "movq %%mm3, 0x60(%0)\n\t" | | 2536 | "movq %%mm3, 0x0C0(%0)\n\t" |
2533 | "movq %%mm4, 0x80(%0)\n\t" | | 2537 | "movq %%mm4, 0x100(%0)\n\t" |
2534 | "movq %%mm5, 0xA0(%0)\n\t" | | 2538 | "movq %%mm5, 0x140(%0)\n\t" |
2535 | "movq %%mm6, 0xC0(%0)\n\t" | | 2539 | "movq %%mm6, 0x180(%0)\n\t" |
2536 | "movq %%mm7, 0xE0(%0)\n\t" | | 2540 | "movq %%mm7, 0x1C0(%0)\n\t" |
2537 | : | | 2541 | : |
2538 | : "a"(out), "m"(fill) | | 2542 | : "a"(out), "m"(fill) |
2539 | : "%mm0", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5", "%mm6", "%mm7" | | 2543 | : "%mm0", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5", "%mm6", "%mm7" |
2540 | ); | | 2544 | ); |
2541 | } | | 2545 | } |
2542 | | | 2546 | |
2543 | __attribute__((target("mmx"))) | | 2547 | __attribute__((target("mmx"))) |
2544 | static __inline void set_mm_regs(const union x86_test_register data[]) | | 2548 | static __inline void set_mm_regs(const union x86_test_register data[]) |
2545 | { | | 2549 | { |
2546 | __asm__ __volatile__( | | 2550 | __asm__ __volatile__( |
2547 | "movq 0x00(%0), %%mm0\n\t" | | 2551 | "movq 0x000(%0), %%mm0\n\t" |
2548 | "movq 0x20(%0), %%mm1\n\t" | | 2552 | "movq 0x040(%0), %%mm1\n\t" |
2549 | "movq 0x40(%0), %%mm2\n\t" | | 2553 | "movq 0x080(%0), %%mm2\n\t" |
2550 | "movq 0x60(%0), %%mm3\n\t" | | 2554 | "movq 0x0C0(%0), %%mm3\n\t" |
2551 | "movq 0x80(%0), %%mm4\n\t" | | 2555 | "movq 0x100(%0), %%mm4\n\t" |
2552 | "movq 0xA0(%0), %%mm5\n\t" | | 2556 | "movq 0x140(%0), %%mm5\n\t" |
2553 | "movq 0xC0(%0), %%mm6\n\t" | | 2557 | "movq 0x180(%0), %%mm6\n\t" |
2554 | "movq 0xE0(%0), %%mm7\n\t" | | 2558 | "movq 0x1C0(%0), %%mm7\n\t" |
2555 | "int3\n\t" | | 2559 | "int3\n\t" |
2556 | : | | 2560 | : |
2557 | : "b"(data) | | 2561 | : "b"(data) |
2558 | : "%mm0", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5", "%mm6", "%mm7" | | 2562 | : "%mm0", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5", "%mm6", "%mm7" |
2559 | ); | | 2563 | ); |
2560 | } | | 2564 | } |
2561 | | | 2565 | |
2562 | __attribute__((target("sse"))) | | 2566 | __attribute__((target("sse"))) |
2563 | static __inline void get_xmm_regs(union x86_test_register out[]) | | 2567 | static __inline void get_xmm_regs(union x86_test_register out[]) |
2564 | { | | 2568 | { |
2565 | union x86_test_register fill __aligned(32) = { | | 2569 | union x86_test_register fill __aligned(32) = { |
2566 | .xmm={ 0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F0F0F0F0F } | | 2570 | .xmm={ 0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F0F0F0F0F } |
2567 | }; | | 2571 | }; |
| @@ -2580,235 +2584,513 @@ static __inline void get_xmm_regs(union | | | @@ -2580,235 +2584,513 @@ static __inline void get_xmm_regs(union |
2580 | "movaps %1, %%xmm8\n\t" | | 2584 | "movaps %1, %%xmm8\n\t" |
2581 | "movaps %1, %%xmm9\n\t" | | 2585 | "movaps %1, %%xmm9\n\t" |
2582 | "movaps %1, %%xmm10\n\t" | | 2586 | "movaps %1, %%xmm10\n\t" |
2583 | "movaps %1, %%xmm11\n\t" | | 2587 | "movaps %1, %%xmm11\n\t" |
2584 | "movaps %1, %%xmm12\n\t" | | 2588 | "movaps %1, %%xmm12\n\t" |
2585 | "movaps %1, %%xmm13\n\t" | | 2589 | "movaps %1, %%xmm13\n\t" |
2586 | "movaps %1, %%xmm14\n\t" | | 2590 | "movaps %1, %%xmm14\n\t" |
2587 | "movaps %1, %%xmm15\n\t" | | 2591 | "movaps %1, %%xmm15\n\t" |
2588 | #endif | | 2592 | #endif |
2589 | "\n\t" | | 2593 | "\n\t" |
2590 | "int3\n\t" | | 2594 | "int3\n\t" |
2591 | "\n\t" | | 2595 | "\n\t" |
2592 | "movaps %%xmm0, 0x000(%0)\n\t" | | 2596 | "movaps %%xmm0, 0x000(%0)\n\t" |
2593 | "movaps %%xmm1, 0x020(%0)\n\t" | | 2597 | "movaps %%xmm1, 0x040(%0)\n\t" |
2594 | "movaps %%xmm2, 0x040(%0)\n\t" | | 2598 | "movaps %%xmm2, 0x080(%0)\n\t" |
2595 | "movaps %%xmm3, 0x060(%0)\n\t" | | 2599 | "movaps %%xmm3, 0x0C0(%0)\n\t" |
2596 | "movaps %%xmm4, 0x080(%0)\n\t" | | 2600 | "movaps %%xmm4, 0x100(%0)\n\t" |
2597 | "movaps %%xmm5, 0x0A0(%0)\n\t" | | 2601 | "movaps %%xmm5, 0x140(%0)\n\t" |
2598 | "movaps %%xmm6, 0x0C0(%0)\n\t" | | 2602 | "movaps %%xmm6, 0x180(%0)\n\t" |
2599 | "movaps %%xmm7, 0x0E0(%0)\n\t" | | 2603 | "movaps %%xmm7, 0x1C0(%0)\n\t" |
2600 | #if defined(__x86_64__) | | 2604 | #if defined(__x86_64__) |
2601 | "movaps %%xmm8, 0x100(%0)\n\t" | | 2605 | "movaps %%xmm8, 0x200(%0)\n\t" |
2602 | "movaps %%xmm9, 0x120(%0)\n\t" | | 2606 | "movaps %%xmm9, 0x240(%0)\n\t" |
2603 | "movaps %%xmm10, 0x140(%0)\n\t" | | 2607 | "movaps %%xmm10, 0x280(%0)\n\t" |
2604 | "movaps %%xmm11, 0x160(%0)\n\t" | | 2608 | "movaps %%xmm11, 0x2C0(%0)\n\t" |
2605 | "movaps %%xmm12, 0x180(%0)\n\t" | | 2609 | "movaps %%xmm12, 0x300(%0)\n\t" |
2606 | "movaps %%xmm13, 0x1A0(%0)\n\t" | | 2610 | "movaps %%xmm13, 0x340(%0)\n\t" |
2607 | "movaps %%xmm14, 0x1C0(%0)\n\t" | | 2611 | "movaps %%xmm14, 0x380(%0)\n\t" |
2608 | "movaps %%xmm15, 0x1E0(%0)\n\t" | | 2612 | "movaps %%xmm15, 0x3C0(%0)\n\t" |
2609 | #endif | | 2613 | #endif |
2610 | : | | 2614 | : |
2611 | : "a"(out), "m"(fill) | | 2615 | : "a"(out), "m"(fill) |
2612 | : "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7" | | 2616 | : "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7" |
2613 | #if defined(__x86_64__) | | 2617 | #if defined(__x86_64__) |
2614 | , "%xmm8", "%xmm9", "%xmm10", "%xmm11", "%xmm12", "%xmm13", "%xmm14", | | 2618 | , "%xmm8", "%xmm9", "%xmm10", "%xmm11", "%xmm12", "%xmm13", "%xmm14", |
2615 | "%xmm15" | | 2619 | "%xmm15" |
2616 | #endif | | 2620 | #endif |
2617 | ); | | 2621 | ); |
2618 | } | | 2622 | } |
2619 | | | 2623 | |
2620 | __attribute__((target("sse"))) | | 2624 | __attribute__((target("sse"))) |
2621 | static __inline void set_xmm_regs(const union x86_test_register data[]) | | 2625 | static __inline void set_xmm_regs(const union x86_test_register data[]) |
2622 | { | | 2626 | { |
2623 | __asm__ __volatile__( | | 2627 | __asm__ __volatile__( |
2624 | "movaps 0x000(%0), %%xmm0\n\t" | | 2628 | "movaps 0x000(%0), %%xmm0\n\t" |
2625 | "movaps 0x020(%0), %%xmm1\n\t" | | 2629 | "movaps 0x040(%0), %%xmm1\n\t" |
2626 | "movaps 0x040(%0), %%xmm2\n\t" | | 2630 | "movaps 0x080(%0), %%xmm2\n\t" |
2627 | "movaps 0x060(%0), %%xmm3\n\t" | | 2631 | "movaps 0x0C0(%0), %%xmm3\n\t" |
2628 | "movaps 0x080(%0), %%xmm4\n\t" | | 2632 | "movaps 0x100(%0), %%xmm4\n\t" |
2629 | "movaps 0x0A0(%0), %%xmm5\n\t" | | 2633 | "movaps 0x140(%0), %%xmm5\n\t" |
2630 | "movaps 0x0C0(%0), %%xmm6\n\t" | | 2634 | "movaps 0x180(%0), %%xmm6\n\t" |
2631 | "movaps 0x0E0(%0), %%xmm7\n\t" | | 2635 | "movaps 0x1C0(%0), %%xmm7\n\t" |
2632 | #if defined(__x86_64__) | | 2636 | #if defined(__x86_64__) |
2633 | "movaps 0x100(%0), %%xmm8\n\t" | | 2637 | "movaps 0x200(%0), %%xmm8\n\t" |
2634 | "movaps 0x120(%0), %%xmm9\n\t" | | 2638 | "movaps 0x240(%0), %%xmm9\n\t" |
2635 | "movaps 0x140(%0), %%xmm10\n\t" | | 2639 | "movaps 0x280(%0), %%xmm10\n\t" |
2636 | "movaps 0x160(%0), %%xmm11\n\t" | | 2640 | "movaps 0x2C0(%0), %%xmm11\n\t" |
2637 | "movaps 0x180(%0), %%xmm12\n\t" | | 2641 | "movaps 0x300(%0), %%xmm12\n\t" |
2638 | "movaps 0x1A0(%0), %%xmm13\n\t" | | 2642 | "movaps 0x340(%0), %%xmm13\n\t" |
2639 | "movaps 0x1C0(%0), %%xmm14\n\t" | | 2643 | "movaps 0x380(%0), %%xmm14\n\t" |
2640 | "movaps 0x1E0(%0), %%xmm15\n\t" | | 2644 | "movaps 0x3C0(%0), %%xmm15\n\t" |
2641 | #endif | | 2645 | #endif |
2642 | "int3\n\t" | | 2646 | "int3\n\t" |
2643 | : | | 2647 | : |
2644 | : "b"(data) | | 2648 | : "b"(data) |
2645 | : "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", | | 2649 | : "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", |
2646 | "%xmm7" | | 2650 | "%xmm7" |
2647 | #if defined(__x86_64__) | | 2651 | #if defined(__x86_64__) |
2648 | , "%xmm8", "%xmm9", "%xmm10", "%xmm11", "%xmm12", "%xmm13", | | 2652 | , "%xmm8", "%xmm9", "%xmm10", "%xmm11", "%xmm12", "%xmm13", |
2649 | "%xmm14", "%xmm15" | | 2653 | "%xmm14", "%xmm15" |
2650 | #endif | | 2654 | #endif |
2651 | ); | | 2655 | ); |
2652 | } | | 2656 | } |
2653 | | | 2657 | |
2654 | __attribute__((target("avx"))) | | 2658 | __attribute__((target("avx"))) |
2655 | static __inline void get_ymm_regs(union x86_test_register out[]) | | 2659 | static __inline void get_ymm_regs(union x86_test_register out[]) |
2656 | { | | 2660 | { |
2657 | union x86_test_register fill __aligned(32) = { | | 2661 | union x86_test_register fill __aligned(32) = { |
2658 | { 0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F0F0F0F0F, | | 2662 | .ymm = { |
2659 | 0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F0F0F0F0F } | | 2663 | 0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F0F0F0F0F, |
| | | 2664 | 0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F0F0F0F0F |
| | | 2665 | } |
2660 | }; | | 2666 | }; |
2661 | | | 2667 | |
2662 | __asm__ __volatile__( | | 2668 | __asm__ __volatile__( |
2663 | /* fill registers with clobber pattern */ | | 2669 | /* fill registers with clobber pattern */ |
2664 | "vmovaps %1, %%ymm0\n\t" | | 2670 | "vmovaps %1, %%ymm0\n\t" |
2665 | "vmovaps %1, %%ymm1\n\t" | | 2671 | "vmovaps %1, %%ymm1\n\t" |
2666 | "vmovaps %1, %%ymm2\n\t" | | 2672 | "vmovaps %1, %%ymm2\n\t" |
2667 | "vmovaps %1, %%ymm3\n\t" | | 2673 | "vmovaps %1, %%ymm3\n\t" |
2668 | "vmovaps %1, %%ymm4\n\t" | | 2674 | "vmovaps %1, %%ymm4\n\t" |
2669 | "vmovaps %1, %%ymm5\n\t" | | 2675 | "vmovaps %1, %%ymm5\n\t" |
2670 | "vmovaps %1, %%ymm6\n\t" | | 2676 | "vmovaps %1, %%ymm6\n\t" |
2671 | "vmovaps %1, %%ymm7\n\t" | | 2677 | "vmovaps %1, %%ymm7\n\t" |
2672 | #if defined(__x86_64__) | | 2678 | #if defined(__x86_64__) |
2673 | "vmovaps %1, %%ymm8\n\t" | | 2679 | "vmovaps %1, %%ymm8\n\t" |
2674 | "vmovaps %1, %%ymm9\n\t" | | 2680 | "vmovaps %1, %%ymm9\n\t" |
2675 | "vmovaps %1, %%ymm10\n\t" | | 2681 | "vmovaps %1, %%ymm10\n\t" |
2676 | "vmovaps %1, %%ymm11\n\t" | | 2682 | "vmovaps %1, %%ymm11\n\t" |
2677 | "vmovaps %1, %%ymm12\n\t" | | 2683 | "vmovaps %1, %%ymm12\n\t" |
2678 | "vmovaps %1, %%ymm13\n\t" | | 2684 | "vmovaps %1, %%ymm13\n\t" |
2679 | "vmovaps %1, %%ymm14\n\t" | | 2685 | "vmovaps %1, %%ymm14\n\t" |
2680 | "vmovaps %1, %%ymm15\n\t" | | 2686 | "vmovaps %1, %%ymm15\n\t" |
2681 | #endif | | 2687 | #endif |
2682 | "\n\t" | | 2688 | "\n\t" |
2683 | "int3\n\t" | | 2689 | "int3\n\t" |
2684 | "\n\t" | | 2690 | "\n\t" |
2685 | "vmovaps %%ymm0, 0x000(%0)\n\t" | | 2691 | "vmovaps %%ymm0, 0x000(%0)\n\t" |
2686 | "vmovaps %%ymm1, 0x020(%0)\n\t" | | 2692 | "vmovaps %%ymm1, 0x040(%0)\n\t" |
2687 | "vmovaps %%ymm2, 0x040(%0)\n\t" | | 2693 | "vmovaps %%ymm2, 0x080(%0)\n\t" |
2688 | "vmovaps %%ymm3, 0x060(%0)\n\t" | | 2694 | "vmovaps %%ymm3, 0x0C0(%0)\n\t" |
2689 | "vmovaps %%ymm4, 0x080(%0)\n\t" | | 2695 | "vmovaps %%ymm4, 0x100(%0)\n\t" |
2690 | "vmovaps %%ymm5, 0x0A0(%0)\n\t" | | 2696 | "vmovaps %%ymm5, 0x140(%0)\n\t" |
2691 | "vmovaps %%ymm6, 0x0C0(%0)\n\t" | | 2697 | "vmovaps %%ymm6, 0x180(%0)\n\t" |
2692 | "vmovaps %%ymm7, 0x0E0(%0)\n\t" | | 2698 | "vmovaps %%ymm7, 0x1C0(%0)\n\t" |
2693 | #if defined(__x86_64__) | | 2699 | #if defined(__x86_64__) |
2694 | "vmovaps %%ymm8, 0x100(%0)\n\t" | | 2700 | "vmovaps %%ymm8, 0x200(%0)\n\t" |
2695 | "vmovaps %%ymm9, 0x120(%0)\n\t" | | 2701 | "vmovaps %%ymm9, 0x240(%0)\n\t" |
2696 | "vmovaps %%ymm10, 0x140(%0)\n\t" | | 2702 | "vmovaps %%ymm10, 0x280(%0)\n\t" |
2697 | "vmovaps %%ymm11, 0x160(%0)\n\t" | | 2703 | "vmovaps %%ymm11, 0x2C0(%0)\n\t" |
2698 | "vmovaps %%ymm12, 0x180(%0)\n\t" | | 2704 | "vmovaps %%ymm12, 0x300(%0)\n\t" |
2699 | "vmovaps %%ymm13, 0x1A0(%0)\n\t" | | 2705 | "vmovaps %%ymm13, 0x340(%0)\n\t" |
2700 | "vmovaps %%ymm14, 0x1C0(%0)\n\t" | | 2706 | "vmovaps %%ymm14, 0x380(%0)\n\t" |
2701 | "vmovaps %%ymm15, 0x1E0(%0)\n\t" | | 2707 | "vmovaps %%ymm15, 0x3C0(%0)\n\t" |
2702 | #endif | | 2708 | #endif |
2703 | : | | 2709 | : |
2704 | : "a"(out), "m"(fill) | | 2710 | : "a"(out), "m"(fill) |
2705 | : "%ymm0", "%ymm1", "%ymm2", "%ymm3", "%ymm4", "%ymm5", "%ymm6", "%ymm7" | | 2711 | : "%ymm0", "%ymm1", "%ymm2", "%ymm3", "%ymm4", "%ymm5", "%ymm6", "%ymm7" |
2706 | #if defined(__x86_64__) | | 2712 | #if defined(__x86_64__) |
2707 | , "%ymm8", "%ymm9", "%ymm10", "%ymm11", "%ymm12", "%ymm13", "%ymm14", | | 2713 | , "%ymm8", "%ymm9", "%ymm10", "%ymm11", "%ymm12", "%ymm13", "%ymm14", |
2708 | "%ymm15" | | 2714 | "%ymm15" |
2709 | #endif | | 2715 | #endif |
2710 | ); | | 2716 | ); |
2711 | } | | 2717 | } |
2712 | | | 2718 | |
2713 | __attribute__((target("avx"))) | | 2719 | __attribute__((target("avx"))) |
2714 | static __inline void set_ymm_regs(const union x86_test_register data[]) | | 2720 | static __inline void set_ymm_regs(const union x86_test_register data[]) |
2715 | { | | 2721 | { |
2716 | __asm__ __volatile__( | | 2722 | __asm__ __volatile__( |
2717 | "vmovaps 0x000(%0), %%ymm0\n\t" | | 2723 | "vmovaps 0x000(%0), %%ymm0\n\t" |
2718 | "vmovaps 0x020(%0), %%ymm1\n\t" | | 2724 | "vmovaps 0x040(%0), %%ymm1\n\t" |
2719 | "vmovaps 0x040(%0), %%ymm2\n\t" | | 2725 | "vmovaps 0x080(%0), %%ymm2\n\t" |
2720 | "vmovaps 0x060(%0), %%ymm3\n\t" | | 2726 | "vmovaps 0x0C0(%0), %%ymm3\n\t" |
2721 | "vmovaps 0x080(%0), %%ymm4\n\t" | | 2727 | "vmovaps 0x100(%0), %%ymm4\n\t" |
2722 | "vmovaps 0x0A0(%0), %%ymm5\n\t" | | 2728 | "vmovaps 0x140(%0), %%ymm5\n\t" |
2723 | "vmovaps 0x0C0(%0), %%ymm6\n\t" | | 2729 | "vmovaps 0x180(%0), %%ymm6\n\t" |
2724 | "vmovaps 0x0E0(%0), %%ymm7\n\t" | | 2730 | "vmovaps 0x1C0(%0), %%ymm7\n\t" |
2725 | #if defined(__x86_64__) | | 2731 | #if defined(__x86_64__) |
2726 | "vmovaps 0x100(%0), %%ymm8\n\t" | | 2732 | "vmovaps 0x200(%0), %%ymm8\n\t" |
2727 | "vmovaps 0x120(%0), %%ymm9\n\t" | | 2733 | "vmovaps 0x240(%0), %%ymm9\n\t" |
2728 | "vmovaps 0x140(%0), %%ymm10\n\t" | | 2734 | "vmovaps 0x280(%0), %%ymm10\n\t" |
2729 | "vmovaps 0x160(%0), %%ymm11\n\t" | | 2735 | "vmovaps 0x2C0(%0), %%ymm11\n\t" |
2730 | "vmovaps 0x180(%0), %%ymm12\n\t" | | 2736 | "vmovaps 0x300(%0), %%ymm12\n\t" |
2731 | "vmovaps 0x1A0(%0), %%ymm13\n\t" | | 2737 | "vmovaps 0x340(%0), %%ymm13\n\t" |
2732 | "vmovaps 0x1C0(%0), %%ymm14\n\t" | | 2738 | "vmovaps 0x380(%0), %%ymm14\n\t" |
2733 | "vmovaps 0x1E0(%0), %%ymm15\n\t" | | 2739 | "vmovaps 0x3C0(%0), %%ymm15\n\t" |
2734 | #endif | | 2740 | #endif |
2735 | "int3\n\t" | | 2741 | "int3\n\t" |
2736 | : | | 2742 | : |
2737 | : "b"(data) | | 2743 | : "b"(data) |
2738 | : "%ymm0", "%ymm1", "%ymm2", "%ymm3", "%ymm4", "%ymm5", "%ymm6", | | 2744 | : "%ymm0", "%ymm1", "%ymm2", "%ymm3", "%ymm4", "%ymm5", "%ymm6", |
2739 | "%ymm7" | | 2745 | "%ymm7" |
2740 | #if defined(__x86_64__) | | 2746 | #if defined(__x86_64__) |
2741 | , "%ymm8", "%ymm9", "%ymm10", "%ymm11", "%ymm12", "%ymm13", | | 2747 | , "%ymm8", "%ymm9", "%ymm10", "%ymm11", "%ymm12", "%ymm13", |
2742 | "%ymm14", "%ymm15" | | 2748 | "%ymm14", "%ymm15" |
2743 | #endif | | 2749 | #endif |
2744 | ); | | 2750 | ); |
2745 | } | | 2751 | } |
2746 | | | 2752 | |
| | | 2753 | __attribute__((target("avx512f"))) |
| | | 2754 | static __inline void get_zmm_regs(union x86_test_register out[]) |
| | | 2755 | { |
| | | 2756 | union x86_test_register fill __aligned(64) = { |
| | | 2757 | .zmm = { |
| | | 2758 | 0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F0F0F0F0F, |
| | | 2759 | 0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F0F0F0F0F, |
| | | 2760 | 0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F0F0F0F0F, |
| | | 2761 | 0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F0F0F0F0F |
| | | 2762 | } |
| | | 2763 | }; |
| | | 2764 | |
| | | 2765 | __asm__ __volatile__( |
| | | 2766 | /* fill registers with clobber pattern */ |
| | | 2767 | "vmovaps %1, %%zmm0\n\t" |
| | | 2768 | "vmovaps %1, %%zmm1\n\t" |
| | | 2769 | "vmovaps %1, %%zmm2\n\t" |
| | | 2770 | "vmovaps %1, %%zmm3\n\t" |
| | | 2771 | "vmovaps %1, %%zmm4\n\t" |
| | | 2772 | "vmovaps %1, %%zmm5\n\t" |
| | | 2773 | "vmovaps %1, %%zmm6\n\t" |
| | | 2774 | "vmovaps %1, %%zmm7\n\t" |
| | | 2775 | #if defined(__x86_64__) |
| | | 2776 | "vmovaps %1, %%zmm8\n\t" |
| | | 2777 | "vmovaps %1, %%zmm9\n\t" |
| | | 2778 | "vmovaps %1, %%zmm10\n\t" |
| | | 2779 | "vmovaps %1, %%zmm11\n\t" |
| | | 2780 | "vmovaps %1, %%zmm12\n\t" |
| | | 2781 | "vmovaps %1, %%zmm13\n\t" |
| | | 2782 | "vmovaps %1, %%zmm14\n\t" |
| | | 2783 | "vmovaps %1, %%zmm15\n\t" |
| | | 2784 | "vmovaps %1, %%zmm16\n\t" |
| | | 2785 | "vmovaps %1, %%zmm17\n\t" |
| | | 2786 | "vmovaps %1, %%zmm18\n\t" |
| | | 2787 | "vmovaps %1, %%zmm19\n\t" |
| | | 2788 | "vmovaps %1, %%zmm20\n\t" |
| | | 2789 | "vmovaps %1, %%zmm21\n\t" |
| | | 2790 | "vmovaps %1, %%zmm22\n\t" |
| | | 2791 | "vmovaps %1, %%zmm23\n\t" |
| | | 2792 | "vmovaps %1, %%zmm24\n\t" |
| | | 2793 | "vmovaps %1, %%zmm25\n\t" |
| | | 2794 | "vmovaps %1, %%zmm26\n\t" |
| | | 2795 | "vmovaps %1, %%zmm27\n\t" |
| | | 2796 | "vmovaps %1, %%zmm28\n\t" |
| | | 2797 | "vmovaps %1, %%zmm29\n\t" |
| | | 2798 | "vmovaps %1, %%zmm30\n\t" |
| | | 2799 | "vmovaps %1, %%zmm31\n\t" |
| | | 2800 | #endif |
| | | 2801 | "kmovq %1, %%k0\n\t" |
| | | 2802 | "kmovq %1, %%k1\n\t" |
| | | 2803 | "kmovq %1, %%k2\n\t" |
| | | 2804 | "kmovq %1, %%k3\n\t" |
| | | 2805 | "kmovq %1, %%k4\n\t" |
| | | 2806 | "kmovq %1, %%k5\n\t" |
| | | 2807 | "kmovq %1, %%k6\n\t" |
| | | 2808 | "kmovq %1, %%k7\n\t" |
| | | 2809 | "\n\t" |
| | | 2810 | "int3\n\t" |
| | | 2811 | "\n\t" |
| | | 2812 | "vmovaps %%zmm0, 0x000(%0)\n\t" |
| | | 2813 | "vmovaps %%zmm1, 0x040(%0)\n\t" |
| | | 2814 | "vmovaps %%zmm2, 0x080(%0)\n\t" |
| | | 2815 | "vmovaps %%zmm3, 0x0C0(%0)\n\t" |
| | | 2816 | "vmovaps %%zmm4, 0x100(%0)\n\t" |
| | | 2817 | "vmovaps %%zmm5, 0x140(%0)\n\t" |
| | | 2818 | "vmovaps %%zmm6, 0x180(%0)\n\t" |
| | | 2819 | "vmovaps %%zmm7, 0x1C0(%0)\n\t" |
| | | 2820 | #if defined(__x86_64__) |
| | | 2821 | "vmovaps %%zmm8, 0x200(%0)\n\t" |
| | | 2822 | "vmovaps %%zmm9, 0x240(%0)\n\t" |
| | | 2823 | "vmovaps %%zmm10, 0x280(%0)\n\t" |
| | | 2824 | "vmovaps %%zmm11, 0x2C0(%0)\n\t" |
| | | 2825 | "vmovaps %%zmm12, 0x300(%0)\n\t" |
| | | 2826 | "vmovaps %%zmm13, 0x340(%0)\n\t" |
| | | 2827 | "vmovaps %%zmm14, 0x380(%0)\n\t" |
| | | 2828 | "vmovaps %%zmm15, 0x3C0(%0)\n\t" |
| | | 2829 | "vmovaps %%zmm16, 0x400(%0)\n\t" |
| | | 2830 | "vmovaps %%zmm17, 0x440(%0)\n\t" |
| | | 2831 | "vmovaps %%zmm18, 0x480(%0)\n\t" |
| | | 2832 | "vmovaps %%zmm19, 0x4C0(%0)\n\t" |
| | | 2833 | "vmovaps %%zmm20, 0x500(%0)\n\t" |
| | | 2834 | "vmovaps %%zmm21, 0x540(%0)\n\t" |
| | | 2835 | "vmovaps %%zmm22, 0x580(%0)\n\t" |
| | | 2836 | "vmovaps %%zmm23, 0x5C0(%0)\n\t" |
| | | 2837 | "vmovaps %%zmm24, 0x600(%0)\n\t" |
| | | 2838 | "vmovaps %%zmm25, 0x640(%0)\n\t" |
| | | 2839 | "vmovaps %%zmm26, 0x680(%0)\n\t" |
| | | 2840 | "vmovaps %%zmm27, 0x6C0(%0)\n\t" |
| | | 2841 | "vmovaps %%zmm28, 0x700(%0)\n\t" |
| | | 2842 | "vmovaps %%zmm29, 0x740(%0)\n\t" |
| | | 2843 | "vmovaps %%zmm30, 0x780(%0)\n\t" |
| | | 2844 | "vmovaps %%zmm31, 0x7C0(%0)\n\t" |
| | | 2845 | #endif |
| | | 2846 | "kmovq %%k0, 0x800(%0)\n\t" |
| | | 2847 | "kmovq %%k1, 0x808(%0)\n\t" |
| | | 2848 | "kmovq %%k2, 0x810(%0)\n\t" |
| | | 2849 | "kmovq %%k3, 0x818(%0)\n\t" |
| | | 2850 | "kmovq %%k4, 0x820(%0)\n\t" |
| | | 2851 | "kmovq %%k5, 0x828(%0)\n\t" |
| | | 2852 | "kmovq %%k6, 0x830(%0)\n\t" |
| | | 2853 | "kmovq %%k7, 0x838(%0)\n\t" |
| | | 2854 | : |
| | | 2855 | : "a"(out), "m"(fill) |
| | | 2856 | : "%zmm0", "%zmm1", "%zmm2", "%zmm3", "%zmm4", "%zmm5", "%zmm6", "%zmm7" |
| | | 2857 | #if defined(__x86_64__) |
| | | 2858 | , "%zmm8", "%zmm9", "%zmm10", "%zmm11", "%zmm12", "%zmm13", "%zmm14", |
| | | 2859 | "%zmm15", "%zmm16", "%zmm17", "%zmm18", "%zmm19", "%zmm20", "%zmm21", |
| | | 2860 | "%zmm22", "%zmm23", "%zmm24", "%zmm25", "%zmm26", "%zmm27", "%zmm28", |
| | | 2861 | "%zmm29", "%zmm30", "%zmm31" |
| | | 2862 | #endif |
| | | 2863 | , "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7" |
| | | 2864 | ); |
| | | 2865 | } |
| | | 2866 | |
| | | 2867 | __attribute__((target("avx512f"))) |
| | | 2868 | static __inline void set_zmm_regs(const union x86_test_register data[]) |
| | | 2869 | { |
| | | 2870 | __asm__ __volatile__( |
| | | 2871 | "vmovaps 0x000(%0), %%zmm0\n\t" |
| | | 2872 | "vmovaps 0x040(%0), %%zmm1\n\t" |
| | | 2873 | "vmovaps 0x080(%0), %%zmm2\n\t" |
| | | 2874 | "vmovaps 0x0C0(%0), %%zmm3\n\t" |
| | | 2875 | "vmovaps 0x100(%0), %%zmm4\n\t" |
| | | 2876 | "vmovaps 0x140(%0), %%zmm5\n\t" |
| | | 2877 | "vmovaps 0x180(%0), %%zmm6\n\t" |
| | | 2878 | "vmovaps 0x1C0(%0), %%zmm7\n\t" |
| | | 2879 | #if defined(__x86_64__) |
| | | 2880 | "vmovaps 0x200(%0), %%zmm8\n\t" |
| | | 2881 | "vmovaps 0x240(%0), %%zmm9\n\t" |
| | | 2882 | "vmovaps 0x280(%0), %%zmm10\n\t" |
| | | 2883 | "vmovaps 0x2C0(%0), %%zmm11\n\t" |
| | | 2884 | "vmovaps 0x300(%0), %%zmm12\n\t" |
| | | 2885 | "vmovaps 0x340(%0), %%zmm13\n\t" |
| | | 2886 | "vmovaps 0x380(%0), %%zmm14\n\t" |
| | | 2887 | "vmovaps 0x3C0(%0), %%zmm15\n\t" |
| | | 2888 | "vmovaps 0x400(%0), %%zmm16\n\t" |
| | | 2889 | "vmovaps 0x440(%0), %%zmm17\n\t" |
| | | 2890 | "vmovaps 0x480(%0), %%zmm18\n\t" |
| | | 2891 | "vmovaps 0x4C0(%0), %%zmm19\n\t" |
| | | 2892 | "vmovaps 0x500(%0), %%zmm20\n\t" |
| | | 2893 | "vmovaps 0x540(%0), %%zmm21\n\t" |
| | | 2894 | "vmovaps 0x580(%0), %%zmm22\n\t" |
| | | 2895 | "vmovaps 0x5C0(%0), %%zmm23\n\t" |
| | | 2896 | "vmovaps 0x600(%0), %%zmm24\n\t" |
| | | 2897 | "vmovaps 0x640(%0), %%zmm25\n\t" |
| | | 2898 | "vmovaps 0x680(%0), %%zmm26\n\t" |
| | | 2899 | "vmovaps 0x6C0(%0), %%zmm27\n\t" |
| | | 2900 | "vmovaps 0x700(%0), %%zmm28\n\t" |
| | | 2901 | "vmovaps 0x740(%0), %%zmm29\n\t" |
| | | 2902 | "vmovaps 0x780(%0), %%zmm30\n\t" |
| | | 2903 | "vmovaps 0x7C0(%0), %%zmm31\n\t" |
| | | 2904 | #endif |
| | | 2905 | "kmovq 0x800(%0), %%k0\n\t" |
| | | 2906 | "kmovq 0x808(%0), %%k1\n\t" |
| | | 2907 | "kmovq 0x810(%0), %%k2\n\t" |
| | | 2908 | "kmovq 0x818(%0), %%k3\n\t" |
| | | 2909 | "kmovq 0x820(%0), %%k4\n\t" |
| | | 2910 | "kmovq 0x828(%0), %%k5\n\t" |
| | | 2911 | "kmovq 0x830(%0), %%k6\n\t" |
| | | 2912 | "kmovq 0x838(%0), %%k7\n\t" |
| | | 2913 | "int3\n\t" |
| | | 2914 | : |
| | | 2915 | : "b"(data) |
| | | 2916 | : "%zmm0", "%zmm1", "%zmm2", "%zmm3", "%zmm4", "%zmm5", "%zmm6", "%zmm7" |
| | | 2917 | #if defined(__x86_64__) |
| | | 2918 | , "%zmm8", "%zmm9", "%zmm10", "%zmm11", "%zmm12", "%zmm13", "%zmm14", |
| | | 2919 | "%zmm15", "%zmm16", "%zmm17", "%zmm18", "%zmm19", "%zmm20", "%zmm21", |
| | | 2920 | "%zmm22", "%zmm23", "%zmm24", "%zmm25", "%zmm26", "%zmm27", "%zmm28", |
| | | 2921 | "%zmm29", "%zmm30", "%zmm31" |
| | | 2922 | #endif |
| | | 2923 | , "%k0", "%k1", "%k2", "%k3", "%k4", |
| | | 2924 | "%k5", "%k6", "%k7" |
| | | 2925 | ); |
| | | 2926 | } |
| | | 2927 | |
2747 | static void | | 2928 | static void |
2748 | x86_register_test(enum x86_test_regset regset, enum x86_test_registers regs, | | 2929 | x86_register_test(enum x86_test_regset regset, enum x86_test_registers regs, |
2749 | enum x86_test_regmode regmode) | | 2930 | enum x86_test_regmode regmode) |
2750 | { | | 2931 | { |
2751 | const int exitval = 5; | | 2932 | const int exitval = 5; |
2752 | pid_t child, wpid; | | 2933 | pid_t child, wpid; |
2753 | #if defined(TWAIT_HAVE_STATUS) | | 2934 | #if defined(TWAIT_HAVE_STATUS) |
2754 | const int sigval = SIGTRAP; | | 2935 | const int sigval = SIGTRAP; |
2755 | int status; | | 2936 | int status; |
2756 | #endif | | 2937 | #endif |
2757 | struct reg gpr; | | 2938 | struct reg gpr; |
2758 | struct fpreg fpr; | | 2939 | struct fpreg fpr; |
2759 | #if defined(__i386__) | | 2940 | #if defined(__i386__) |
2760 | struct xmmregs xmm; | | 2941 | struct xmmregs xmm; |
2761 | #endif | | 2942 | #endif |
2762 | struct xstate xst; | | 2943 | struct xstate xst; |
2763 | struct iovec iov; | | 2944 | struct iovec iov; |
2764 | struct fxsave* fxs = NULL; | | 2945 | struct fxsave* fxs = NULL; |
2765 | uint64_t xst_flags = 0; | | 2946 | uint64_t xst_flags = 0; |
2766 | char core_path[] = "/tmp/core.XXXXXX"; | | 2947 | char core_path[] = "/tmp/core.XXXXXX"; |
2767 | int core_fd; | | 2948 | int core_fd; |
2768 | | | 2949 | |
2769 | const union x86_test_register expected[] __aligned(32) = { | | 2950 | const union x86_test_register expected[] __aligned(64) = { |
2770 | {{ 0x0706050403020100, 0x0F0E0D0C0B0A0908, | | 2951 | {{ 0x0706050403020100, 0x0F0E0D0C0B0A0908, |
2771 | 0x1716151413121110, 0x1F1E1D1C1B1A1918, }}, | | 2952 | 0x1716151413121110, 0x1F1E1D1C1B1A1918, |
| | | 2953 | 0x2726252423222120, 0x2F2E2D2C2B2A2928, |
| | | 2954 | 0x3736353433323130, 0x3F3E3D3C3B3A3938, }}, |
2772 | {{ 0x0807060504030201, 0x100F0E0D0C0B0A09, | | 2955 | {{ 0x0807060504030201, 0x100F0E0D0C0B0A09, |
2773 | 0x1817161514131211, 0x201F1E1D1C1B1A19, }}, | | 2956 | 0x1817161514131211, 0x201F1E1D1C1B1A19, |
| | | 2957 | 0x2827262524232221, 0x302F2E2D2C2B2A29, |
| | | 2958 | 0x3837363534333231, 0x403F3E3D3C3B3A39, }}, |
2774 | {{ 0x0908070605040302, 0x11100F0E0D0C0B0A, | | 2959 | {{ 0x0908070605040302, 0x11100F0E0D0C0B0A, |
2775 | 0x1918171615141312, 0x21201F1E1D1C1B1A, }}, | | 2960 | 0x1918171615141312, 0x21201F1E1D1C1B1A, |
| | | 2961 | 0x2928272625242322, 0x31302F2E2D2C2B2A, |
| | | 2962 | 0x3938373635343332, 0x41403F3E3D3C3B3A, }}, |
2776 | {{ 0x0A09080706050403, 0x1211100F0E0D0C0B, | | 2963 | {{ 0x0A09080706050403, 0x1211100F0E0D0C0B, |
2777 | 0x1A19181716151413, 0x2221201F1E1D1C1B, }}, | | 2964 | 0x1A19181716151413, 0x2221201F1E1D1C1B, |
| | | 2965 | 0x2A29282726252423, 0x3231302F2E2D2C2B, |
| | | 2966 | 0x3A39383736353433, 0x4241403F3E3D3C3B, }}, |
2778 | {{ 0x0B0A090807060504, 0x131211100F0E0D0C, | | 2967 | {{ 0x0B0A090807060504, 0x131211100F0E0D0C, |
2779 | 0x1B1A191817161514, 0x232221201F1E1D1C, }}, | | 2968 | 0x1B1A191817161514, 0x232221201F1E1D1C, |
| | | 2969 | 0x2B2A292827262524, 0x333231302F2E2D2C, |
| | | 2970 | 0x3B3A393837363534, 0x434241403F3E3D3C, }}, |
2780 | {{ 0x0C0B0A0908070605, 0x14131211100F0E0D, | | 2971 | {{ 0x0C0B0A0908070605, 0x14131211100F0E0D, |
2781 | 0x1C1B1A1918171615, 0x24232221201F1E1D, }}, | | 2972 | 0x1C1B1A1918171615, 0x24232221201F1E1D, |
| | | 2973 | 0x2C2B2A2928272625, 0x34333231302F2E2D, |
| | | 2974 | 0x3C3B3A3938373635, 0x44434241403F3E3D, }}, |
2782 | {{ 0x0D0C0B0A09080706, 0x1514131211100F0E, | | 2975 | {{ 0x0D0C0B0A09080706, 0x1514131211100F0E, |
2783 | 0x1D1C1B1A19181716, 0x2524232221201F1E, }}, | | 2976 | 0x1D1C1B1A19181716, 0x2524232221201F1E, |
| | | 2977 | 0x2D2C2B2A29282726, 0x3534333231302F2E, |
| | | 2978 | 0x3D3C3B3A39383736, 0x4544434241403F3E, }}, |
2784 | {{ 0x0E0D0C0B0A090807, 0x161514131211100F, | | 2979 | {{ 0x0E0D0C0B0A090807, 0x161514131211100F, |
2785 | 0x1E1D1C1B1A191817, 0x262524232221201F, }}, | | 2980 | 0x1E1D1C1B1A191817, 0x262524232221201F, |
| | | 2981 | 0x2E2D2C2B2A292827, 0x363534333231302F, |
| | | 2982 | 0x3E3D3C3B3A393837, 0x464544434241403F, }}, |
2786 | {{ 0x0F0E0D0C0B0A0908, 0x1716151413121110, | | 2983 | {{ 0x0F0E0D0C0B0A0908, 0x1716151413121110, |
2787 | 0x1F1E1D1C1B1A1918, 0x2726252423222120, }}, | | 2984 | 0x1F1E1D1C1B1A1918, 0x2726252423222120, |
| | | 2985 | 0x2F2E2D2C2B2A2928, 0x3736353433323130, |
| | | 2986 | 0x3F3E3D3C3B3A3938, 0x4746454443424140, }}, |
2788 | {{ 0x100F0E0D0C0B0A09, 0x1817161514131211, | | 2987 | {{ 0x100F0E0D0C0B0A09, 0x1817161514131211, |
2789 | 0x201F1E1D1C1B1A19, 0x2827262524232221, }}, | | 2988 | 0x201F1E1D1C1B1A19, 0x2827262524232221, |
| | | 2989 | 0x302F2E2D2C2B2A29, 0x3837363534333231, |
| | | 2990 | 0x403F3E3D3C3B3A39, 0x4847464544434241, }}, |
2790 | {{ 0x11100F0E0D0C0B0A, 0x1918171615141312, | | 2991 | {{ 0x11100F0E0D0C0B0A, 0x1918171615141312, |
2791 | 0x21201F1E1D1C1B1A, 0x2928272625242322, }}, | | 2992 | 0x21201F1E1D1C1B1A, 0x2928272625242322, |
| | | 2993 | 0x31302F2E2D2C2B2A, 0x3938373635343332, |
| | | 2994 | 0x41403F3E3D3C3B3A, 0x4948474645444342, }}, |
2792 | {{ 0x1211100F0E0D0C0B, 0x1A19181716151413, | | 2995 | {{ 0x1211100F0E0D0C0B, 0x1A19181716151413, |
2793 | 0x2221201F1E1D1C1B, 0x2A29282726252423, }}, | | 2996 | 0x2221201F1E1D1C1B, 0x2A29282726252423, |
| | | 2997 | 0x3231302F2E2D2C2B, 0x3A39383736353433, |
| | | 2998 | 0x4241403F3E3D3C3B, 0x4A49484746454443, }}, |
2794 | {{ 0x131211100F0E0D0C, 0x1B1A191817161514, | | 2999 | {{ 0x131211100F0E0D0C, 0x1B1A191817161514, |
2795 | 0x232221201F1E1D1C, 0x2B2A292827262524, }}, | | 3000 | 0x232221201F1E1D1C, 0x2B2A292827262524, |
| | | 3001 | 0x333231302F2E2D2C, 0x3B3A393837363534, |
| | | 3002 | 0x434241403F3E3D3C, 0x4B4A494847464544, }}, |
2796 | {{ 0x14131211100F0E0D, 0x1C1B1A1918171615, | | 3003 | {{ 0x14131211100F0E0D, 0x1C1B1A1918171615, |
2797 | 0x24232221201F1E1D, 0x2C2B2A2928272625, }}, | | 3004 | 0x24232221201F1E1D, 0x2C2B2A2928272625, |
| | | 3005 | 0x34333231302F2E2D, 0x3C3B3A3938373635, |
| | | 3006 | 0x44434241403F3E3D, 0x4C4B4A4948474645, }}, |
2798 | {{ 0x1514131211100F0E, 0x1D1C1B1A19181716, | | 3007 | {{ 0x1514131211100F0E, 0x1D1C1B1A19181716, |
2799 | 0x2524232221201F1E, 0x2D2C2B2A29282726, }}, | | 3008 | 0x2524232221201F1E, 0x2D2C2B2A29282726, |
| | | 3009 | 0x3534333231302F2E, 0x3D3C3B3A39383736, |
| | | 3010 | 0x4544434241403F3E, 0x4D4C4B4A49484746, }}, |
2800 | {{ 0x161514131211100F, 0x1E1D1C1B1A191817, | | 3011 | {{ 0x161514131211100F, 0x1E1D1C1B1A191817, |
2801 | 0x262524232221201F, 0x2E2D2C2B2A292827, }}, | | 3012 | 0x262524232221201F, 0x2E2D2C2B2A292827, |
| | | 3013 | 0x363534333231302F, 0x3E3D3C3B3A393837, |
| | | 3014 | 0x464544434241403F, 0x4E4D4C4B4A494847, }}, |
| | | 3015 | {{ 0x1716151413121110, 0x1F1E1D1C1B1A1918, |
| | | 3016 | 0x2726252423222120, 0x2F2E2D2C2B2A2928, |
| | | 3017 | 0x3736353433323130, 0x3F3E3D3C3B3A3938, |
| | | 3018 | 0x4746454443424140, 0x4F4E4D4C4B4A4948, }}, |
| | | 3019 | {{ 0x1817161514131211, 0x201F1E1D1C1B1A19, |
| | | 3020 | 0x2827262524232221, 0x302F2E2D2C2B2A29, |
| | | 3021 | 0x3837363534333231, 0x403F3E3D3C3B3A39, |
| | | 3022 | 0x4847464544434241, 0x504F4E4D4C4B4A49, }}, |
| | | 3023 | {{ 0x1918171615141312, 0x21201F1E1D1C1B1A, |
| | | 3024 | 0x2928272625242322, 0x31302F2E2D2C2B2A, |
| | | 3025 | 0x3938373635343332, 0x41403F3E3D3C3B3A, |
| | | 3026 | 0x4948474645444342, 0x51504F4E4D4C4B4A, }}, |
| | | 3027 | {{ 0x1A19181716151413, 0x2221201F1E1D1C1B, |
| | | 3028 | 0x2A29282726252423, 0x3231302F2E2D2C2B, |
| | | 3029 | 0x3A39383736353433, 0x4241403F3E3D3C3B, |
| | | 3030 | 0x4A49484746454443, 0x5251504F4E4D4C4B, }}, |
| | | 3031 | {{ 0x1B1A191817161514, 0x232221201F1E1D1C, |
| | | 3032 | 0x2B2A292827262524, 0x333231302F2E2D2C, |
| | | 3033 | 0x3B3A393837363534, 0x434241403F3E3D3C, |
| | | 3034 | 0x4B4A494847464544, 0x535251504F4E4D4C, }}, |
| | | 3035 | {{ 0x1C1B1A1918171615, 0x24232221201F1E1D, |
| | | 3036 | 0x2C2B2A2928272625, 0x34333231302F2E2D, |
| | | 3037 | 0x3C3B3A3938373635, 0x44434241403F3E3D, |
| | | 3038 | 0x4C4B4A4948474645, 0x54535251504F4E4D, }}, |
| | | 3039 | {{ 0x1D1C1B1A19181716, 0x2524232221201F1E, |
| | | 3040 | 0x2D2C2B2A29282726, 0x3534333231302F2E, |
| | | 3041 | 0x3D3C3B3A39383736, 0x4544434241403F3E, |
| | | 3042 | 0x4D4C4B4A49484746, 0x5554535251504F4E, }}, |
| | | 3043 | {{ 0x1E1D1C1B1A191817, 0x262524232221201F, |
| | | 3044 | 0x2E2D2C2B2A292827, 0x363534333231302F, |
| | | 3045 | 0x3E3D3C3B3A393837, 0x464544434241403F, |
| | | 3046 | 0x4E4D4C4B4A494847, 0x565554535251504F, }}, |
| | | 3047 | {{ 0x1F1E1D1C1B1A1918, 0x2726252423222120, |
| | | 3048 | 0x2F2E2D2C2B2A2928, 0x3736353433323130, |
| | | 3049 | 0x3F3E3D3C3B3A3938, 0x4746454443424140, |
| | | 3050 | 0x4F4E4D4C4B4A4948, 0x5756555453525150, }}, |
| | | 3051 | {{ 0x201F1E1D1C1B1A19, 0x2827262524232221, |
| | | 3052 | 0x302F2E2D2C2B2A29, 0x3837363534333231, |
| | | 3053 | 0x403F3E3D3C3B3A39, 0x4847464544434241, |
| | | 3054 | 0x504F4E4D4C4B4A49, 0x5857565554535251, }}, |
| | | 3055 | {{ 0x21201F1E1D1C1B1A, 0x2928272625242322, |
| | | 3056 | 0x31302F2E2D2C2B2A, 0x3938373635343332, |
| | | 3057 | 0x41403F3E3D3C3B3A, 0x4948474645444342, |
| | | 3058 | 0x51504F4E4D4C4B4A, 0x5958575655545352, }}, |
| | | 3059 | {{ 0x2221201F1E1D1C1B, 0x2A29282726252423, |
| | | 3060 | 0x3231302F2E2D2C2B, 0x3A39383736353433, |
| | | 3061 | 0x4241403F3E3D3C3B, 0x4A49484746454443, |
| | | 3062 | 0x5251504F4E4D4C4B, 0x5A59585756555453, }}, |
| | | 3063 | {{ 0x232221201F1E1D1C, 0x2B2A292827262524, |
| | | 3064 | 0x333231302F2E2D2C, 0x3B3A393837363534, |
| | | 3065 | 0x434241403F3E3D3C, 0x4B4A494847464544, |
| | | 3066 | 0x535251504F4E4D4C, 0x5B5A595857565554, }}, |
| | | 3067 | {{ 0x24232221201F1E1D, 0x2C2B2A2928272625, |
| | | 3068 | 0x34333231302F2E2D, 0x3C3B3A3938373635, |
| | | 3069 | 0x44434241403F3E3D, 0x4C4B4A4948474645, |
| | | 3070 | 0x54535251504F4E4D, 0x5C5B5A5958575655, }}, |
| | | 3071 | {{ 0x2524232221201F1E, 0x2D2C2B2A29282726, |
| | | 3072 | 0x3534333231302F2E, 0x3D3C3B3A39383736, |
| | | 3073 | 0x4544434241403F3E, 0x4D4C4B4A49484746, |
| | | 3074 | 0x5554535251504F4E, 0x5D5C5B5A59585756, }}, |
| | | 3075 | {{ 0x262524232221201F, 0x2E2D2C2B2A292827, |
| | | 3076 | 0x363534333231302F, 0x3E3D3C3B3A393837, |
| | | 3077 | 0x464544434241403F, 0x4E4D4C4B4A494847, |
| | | 3078 | 0x565554535251504F, 0x5E5D5C5B5A595857, }}, |
| | | 3079 | /* k0..k7 */ |
| | | 3080 | {{ 0x2726252423222120, 0x2F2E2D2C2B2A2928, |
| | | 3081 | 0x3736353433323130, 0x3F3E3D3C3B3A3938, |
| | | 3082 | 0x4746454443424140, 0x4F4E4D4C4B4A4948, |
| | | 3083 | 0x5756555453525150, 0x5F5E5D5C5B5A5958, }}, |
2802 | }; | | 3084 | }; |
2803 | | | 3085 | |
2804 | const struct x86_test_fpu_registers expected_fpu = { | | 3086 | const struct x86_test_fpu_registers expected_fpu = { |
2805 | .st = { | | 3087 | .st = { |
2806 | {0x8000000000000000, 0x4000}, /* +2.0 */ | | 3088 | {0x8000000000000000, 0x4000}, /* +2.0 */ |
2807 | {0x3f00000000000000, 0x0000}, /* 1.654785e-4932 */ | | 3089 | {0x3f00000000000000, 0x0000}, /* 1.654785e-4932 */ |
2808 | {0x0000000000000000, 0x0000}, /* +0 */ | | 3090 | {0x0000000000000000, 0x0000}, /* +0 */ |
2809 | {0x0000000000000000, 0x8000}, /* -0 */ | | 3091 | {0x0000000000000000, 0x8000}, /* -0 */ |
2810 | {0x8000000000000000, 0x7fff}, /* +inf */ | | 3092 | {0x8000000000000000, 0x7fff}, /* +inf */ |
2811 | {0x8000000000000000, 0xffff}, /* -inf */ | | 3093 | {0x8000000000000000, 0xffff}, /* -inf */ |
2812 | {0xc000000000000000, 0xffff}, /* nan */ | | 3094 | {0xc000000000000000, 0xffff}, /* nan */ |
2813 | /* st(7) will be freed to test tag word better */ | | 3095 | /* st(7) will be freed to test tag word better */ |
2814 | {0x0000000000000000, 0x0000}, /* +0 */ | | 3096 | {0x0000000000000000, 0x0000}, /* +0 */ |
| @@ -2855,77 +3137,89 @@ x86_register_test(enum x86_test_regset r | | | @@ -2855,77 +3137,89 @@ x86_register_test(enum x86_test_regset r |
2855 | case GPREGS_32: | | 3137 | case GPREGS_32: |
2856 | case GPREGS_32_EBP_ESP: | | 3138 | case GPREGS_32_EBP_ESP: |
2857 | need_32 = true; | | 3139 | need_32 = true; |
2858 | break; | | 3140 | break; |
2859 | case GPREGS_64: | | 3141 | case GPREGS_64: |
2860 | case GPREGS_64_R8: | | 3142 | case GPREGS_64_R8: |
2861 | need_64 = true; | | 3143 | need_64 = true; |
2862 | break; | | 3144 | break; |
2863 | case FPREGS_FPU: | | 3145 | case FPREGS_FPU: |
2864 | break; | | 3146 | break; |
2865 | case FPREGS_MM: | | 3147 | case FPREGS_MM: |
2866 | case FPREGS_XMM: | | 3148 | case FPREGS_XMM: |
2867 | case FPREGS_YMM: | | 3149 | case FPREGS_YMM: |
| | | 3150 | case FPREGS_ZMM: |
2868 | need_cpuid = true; | | 3151 | need_cpuid = true; |
2869 | break; | | 3152 | break; |
2870 | } | | 3153 | } |
2871 | | | 3154 | |
2872 | if (need_32) { | | 3155 | if (need_32) { |
2873 | #if defined(__x86_64__) | | 3156 | #if defined(__x86_64__) |
2874 | atf_tc_skip("Test requires 32-bit mode"); | | 3157 | atf_tc_skip("Test requires 32-bit mode"); |
2875 | #endif | | 3158 | #endif |
2876 | } | | 3159 | } |
2877 | if (need_64) { | | 3160 | if (need_64) { |
2878 | #if defined(__i386__) | | 3161 | #if defined(__i386__) |
2879 | atf_tc_skip("Test requires 64-bit mode"); | | 3162 | atf_tc_skip("Test requires 64-bit mode"); |
2880 | #endif | | 3163 | #endif |
2881 | } | | 3164 | } |
2882 | | | 3165 | |
2883 | if (need_cpuid) { | | 3166 | if (need_cpuid) { |
2884 | /* verify whether needed instruction sets are supported here */ | | 3167 | /* verify whether needed instruction sets are supported here */ |
2885 | unsigned int eax, ebx, ecx, edx; | | 3168 | unsigned int eax, ebx, ecx, edx; |
| | | 3169 | unsigned int eax7, ebx7, ecx7, edx7; |
2886 | | | 3170 | |
2887 | DPRINTF("Before invoking cpuid\n"); | | 3171 | DPRINTF("Before invoking cpuid\n"); |
2888 | if (!__get_cpuid(1, &eax, &ebx, &ecx, &edx)) | | 3172 | if (!__get_cpuid(1, &eax, &ebx, &ecx, &edx)) |
2889 | atf_tc_skip("CPUID is not supported by the CPU"); | | 3173 | atf_tc_skip("CPUID is not supported by the CPU"); |
2890 | | | 3174 | |
2891 | DPRINTF("cpuid: ECX = %08x, EDX = %08xd\n", ecx, edx); | | 3175 | DPRINTF("cpuid[eax=1]: ECX = %08x, EDX = %08xd\n", ecx, edx); |
2892 | | | 3176 | |
2893 | switch (regs) { | | 3177 | switch (regs) { |
| | | 3178 | case FPREGS_ZMM: |
| | | 3179 | /* ZMM is in EAX=7, ECX=0 */ |
| | | 3180 | if (!__get_cpuid_count(7, 0, &eax7, &ebx7, &ecx7, &edx7)) |
| | | 3181 | atf_tc_skip( |
| | | 3182 | "AVX512F is not supported by the CPU"); |
| | | 3183 | DPRINTF("cpuid[eax=7,ecx=0]: EBX = %08x\n", ebx7); |
| | | 3184 | if (!(ebx7 & bit_AVX512F)) |
| | | 3185 | atf_tc_skip( |
| | | 3186 | "AVX512F is not supported by the CPU"); |
| | | 3187 | /*FALLTHROUGH*/ |
2894 | case FPREGS_YMM: | | 3188 | case FPREGS_YMM: |
2895 | if (!(ecx & bit_AVX)) | | 3189 | if (!(ecx & bit_AVX)) |
2896 | atf_tc_skip("AVX is not supported by the CPU"); | | 3190 | atf_tc_skip("AVX is not supported by the CPU"); |
2897 | /*FALLTHROUGH*/ | | 3191 | /*FALLTHROUGH*/ |
2898 | case FPREGS_XMM: | | 3192 | case FPREGS_XMM: |
2899 | if (!(edx & bit_SSE)) | | 3193 | if (!(edx & bit_SSE)) |
2900 | atf_tc_skip("SSE is not supported by the CPU"); | | 3194 | atf_tc_skip("SSE is not supported by the CPU"); |
2901 | break; | | 3195 | break; |
2902 | case FPREGS_MM: | | 3196 | case FPREGS_MM: |
2903 | if (!(edx & bit_MMX)) | | 3197 | if (!(edx & bit_MMX)) |
2904 | atf_tc_skip("MMX is not supported by the CPU"); | | 3198 | atf_tc_skip("MMX is not supported by the CPU"); |
2905 | break; | | 3199 | break; |
2906 | case GPREGS_32: | | 3200 | case GPREGS_32: |
2907 | case GPREGS_32_EBP_ESP: | | 3201 | case GPREGS_32_EBP_ESP: |
2908 | case GPREGS_64: | | 3202 | case GPREGS_64: |
2909 | case GPREGS_64_R8: | | 3203 | case GPREGS_64_R8: |
2910 | case FPREGS_FPU: | | 3204 | case FPREGS_FPU: |
2911 | __unreachable(); | | 3205 | __unreachable(); |
2912 | } | | 3206 | } |
2913 | } | | 3207 | } |
2914 | | | 3208 | |
2915 | DPRINTF("Before forking process PID=%d\n", getpid()); | | 3209 | DPRINTF("Before forking process PID=%d\n", getpid()); |
2916 | SYSCALL_REQUIRE((child = fork()) != -1); | | 3210 | SYSCALL_REQUIRE((child = fork()) != -1); |
2917 | if (child == 0) { | | 3211 | if (child == 0) { |
2918 | union x86_test_register vals[16] __aligned(32); | | 3212 | union x86_test_register vals[__arraycount(expected)] __aligned(64); |
2919 | struct x86_test_fpu_registers vals_fpu; | | 3213 | struct x86_test_fpu_registers vals_fpu; |
2920 | | | 3214 | |
2921 | DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); | | 3215 | DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid()); |
2922 | FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); | | 3216 | FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1); |
2923 | | | 3217 | |
2924 | DPRINTF("Before running assembly from child\n"); | | 3218 | DPRINTF("Before running assembly from child\n"); |
2925 | switch (regmode) { | | 3219 | switch (regmode) { |
2926 | case TEST_GETREGS: | | 3220 | case TEST_GETREGS: |
2927 | case TEST_COREDUMP: | | 3221 | case TEST_COREDUMP: |
2928 | switch (regs) { | | 3222 | switch (regs) { |
2929 | case GPREGS_32: | | 3223 | case GPREGS_32: |
2930 | set_gp32_regs(expected); | | 3224 | set_gp32_regs(expected); |
2931 | break; | | 3225 | break; |
| @@ -2940,26 +3234,29 @@ x86_register_test(enum x86_test_regset r | | | @@ -2940,26 +3234,29 @@ x86_register_test(enum x86_test_regset r |
2940 | break; | | 3234 | break; |
2941 | case FPREGS_FPU: | | 3235 | case FPREGS_FPU: |
2942 | set_fpu_regs(&expected_fpu); | | 3236 | set_fpu_regs(&expected_fpu); |
2943 | break; | | 3237 | break; |
2944 | case FPREGS_MM: | | 3238 | case FPREGS_MM: |
2945 | set_mm_regs(expected); | | 3239 | set_mm_regs(expected); |
2946 | break; | | 3240 | break; |
2947 | case FPREGS_XMM: | | 3241 | case FPREGS_XMM: |
2948 | set_xmm_regs(expected); | | 3242 | set_xmm_regs(expected); |
2949 | break; | | 3243 | break; |
2950 | case FPREGS_YMM: | | 3244 | case FPREGS_YMM: |
2951 | set_ymm_regs(expected); | | 3245 | set_ymm_regs(expected); |
2952 | break; | | 3246 | break; |
| | | 3247 | case FPREGS_ZMM: |
| | | 3248 | set_zmm_regs(expected); |
| | | 3249 | break; |
2953 | } | | 3250 | } |
2954 | break; | | 3251 | break; |
2955 | case TEST_SETREGS: | | 3252 | case TEST_SETREGS: |
2956 | switch (regs) { | | 3253 | switch (regs) { |
2957 | case GPREGS_32: | | 3254 | case GPREGS_32: |
2958 | get_gp32_regs(vals); | | 3255 | get_gp32_regs(vals); |
2959 | break; | | 3256 | break; |
2960 | case GPREGS_32_EBP_ESP: | | 3257 | case GPREGS_32_EBP_ESP: |
2961 | get_gp32_ebp_esp_regs(vals); | | 3258 | get_gp32_ebp_esp_regs(vals); |
2962 | break; | | 3259 | break; |
2963 | case GPREGS_64: | | 3260 | case GPREGS_64: |
2964 | get_gp64_regs(vals); | | 3261 | get_gp64_regs(vals); |
2965 | break; | | 3262 | break; |
| @@ -2968,26 +3265,29 @@ x86_register_test(enum x86_test_regset r | | | @@ -2968,26 +3265,29 @@ x86_register_test(enum x86_test_regset r |
2968 | break; | | 3265 | break; |
2969 | case FPREGS_FPU: | | 3266 | case FPREGS_FPU: |
2970 | get_fpu_regs(&vals_fpu); | | 3267 | get_fpu_regs(&vals_fpu); |
2971 | break; | | 3268 | break; |
2972 | case FPREGS_MM: | | 3269 | case FPREGS_MM: |
2973 | get_mm_regs(vals); | | 3270 | get_mm_regs(vals); |
2974 | break; | | 3271 | break; |
2975 | case FPREGS_XMM: | | 3272 | case FPREGS_XMM: |
2976 | get_xmm_regs(vals); | | 3273 | get_xmm_regs(vals); |
2977 | break; | | 3274 | break; |
2978 | case FPREGS_YMM: | | 3275 | case FPREGS_YMM: |
2979 | get_ymm_regs(vals); | | 3276 | get_ymm_regs(vals); |
2980 | break; | | 3277 | break; |
| | | 3278 | case FPREGS_ZMM: |
| | | 3279 | get_zmm_regs(vals); |
| | | 3280 | break; |
2981 | } | | 3281 | } |
2982 | | | 3282 | |
2983 | DPRINTF("Before comparing results\n"); | | 3283 | DPRINTF("Before comparing results\n"); |
2984 | switch (regs) { | | 3284 | switch (regs) { |
2985 | case GPREGS_32: | | 3285 | case GPREGS_32: |
2986 | FORKEE_ASSERT(!memcmp(&vals[5].u32, | | 3286 | FORKEE_ASSERT(!memcmp(&vals[5].u32, |
2987 | &expected[5].u32, sizeof(vals->u32))); | | 3287 | &expected[5].u32, sizeof(vals->u32))); |
2988 | FORKEE_ASSERT(!memcmp(&vals[4].u32, | | 3288 | FORKEE_ASSERT(!memcmp(&vals[4].u32, |
2989 | &expected[4].u32, sizeof(vals->u32))); | | 3289 | &expected[4].u32, sizeof(vals->u32))); |
2990 | FORKEE_ASSERT(!memcmp(&vals[3].u32, | | 3290 | FORKEE_ASSERT(!memcmp(&vals[3].u32, |
2991 | &expected[3].u32, sizeof(vals->u32))); | | 3291 | &expected[3].u32, sizeof(vals->u32))); |
2992 | FORKEE_ASSERT(!memcmp(&vals[2].u32, | | 3292 | FORKEE_ASSERT(!memcmp(&vals[2].u32, |
2993 | &expected[2].u32, sizeof(vals->u32))); | | 3293 | &expected[2].u32, sizeof(vals->u32))); |
| @@ -3121,46 +3421,129 @@ x86_register_test(enum x86_test_regset r | | | @@ -3121,46 +3421,129 @@ x86_register_test(enum x86_test_regset r |
3121 | &expected[10].ymm, sizeof(vals->ymm))); | | 3421 | &expected[10].ymm, sizeof(vals->ymm))); |
3122 | FORKEE_ASSERT(!memcmp(&vals[11].ymm, | | 3422 | FORKEE_ASSERT(!memcmp(&vals[11].ymm, |
3123 | &expected[11].ymm, sizeof(vals->ymm))); | | 3423 | &expected[11].ymm, sizeof(vals->ymm))); |
3124 | FORKEE_ASSERT(!memcmp(&vals[12].ymm, | | 3424 | FORKEE_ASSERT(!memcmp(&vals[12].ymm, |
3125 | &expected[12].ymm, sizeof(vals->ymm))); | | 3425 | &expected[12].ymm, sizeof(vals->ymm))); |
3126 | FORKEE_ASSERT(!memcmp(&vals[13].ymm, | | 3426 | FORKEE_ASSERT(!memcmp(&vals[13].ymm, |
3127 | &expected[13].ymm, sizeof(vals->ymm))); | | 3427 | &expected[13].ymm, sizeof(vals->ymm))); |
3128 | FORKEE_ASSERT(!memcmp(&vals[14].ymm, | | 3428 | FORKEE_ASSERT(!memcmp(&vals[14].ymm, |
3129 | &expected[14].ymm, sizeof(vals->ymm))); | | 3429 | &expected[14].ymm, sizeof(vals->ymm))); |
3130 | FORKEE_ASSERT(!memcmp(&vals[15].ymm, | | 3430 | FORKEE_ASSERT(!memcmp(&vals[15].ymm, |
3131 | &expected[15].ymm, sizeof(vals->ymm))); | | 3431 | &expected[15].ymm, sizeof(vals->ymm))); |
3132 | #endif | | 3432 | #endif |
3133 | break; | | 3433 | break; |
| | | 3434 | case FPREGS_ZMM: |
| | | 3435 | FORKEE_ASSERT(!memcmp(&vals[0].zmm, |
| | | 3436 | &expected[0].zmm, sizeof(vals->zmm))); |
| | | 3437 | FORKEE_ASSERT(!memcmp(&vals[1].zmm, |
| | | 3438 | &expected[1].zmm, sizeof(vals->zmm))); |
| | | 3439 | FORKEE_ASSERT(!memcmp(&vals[2].zmm, |
| | | 3440 | &expected[2].zmm, sizeof(vals->zmm))); |
| | | 3441 | FORKEE_ASSERT(!memcmp(&vals[3].zmm, |
| | | 3442 | &expected[3].zmm, sizeof(vals->zmm))); |
| | | 3443 | FORKEE_ASSERT(!memcmp(&vals[4].zmm, |
| | | 3444 | &expected[4].zmm, sizeof(vals->zmm))); |
| | | 3445 | FORKEE_ASSERT(!memcmp(&vals[5].zmm, |
| | | 3446 | &expected[5].zmm, sizeof(vals->zmm))); |
| | | 3447 | FORKEE_ASSERT(!memcmp(&vals[6].zmm, |
| | | 3448 | &expected[6].zmm, sizeof(vals->zmm))); |
| | | 3449 | FORKEE_ASSERT(!memcmp(&vals[7].zmm, |
| | | 3450 | &expected[7].zmm, sizeof(vals->zmm))); |
| | | 3451 | #if defined(__x86_64__) |
| | | 3452 | FORKEE_ASSERT(!memcmp(&vals[8].zmm, |
| | | 3453 | &expected[8].zmm, sizeof(vals->zmm))); |
| | | 3454 | FORKEE_ASSERT(!memcmp(&vals[9].zmm, |
| | | 3455 | &expected[9].zmm, sizeof(vals->zmm))); |
| | | 3456 | FORKEE_ASSERT(!memcmp(&vals[10].zmm, |
| | | 3457 | &expected[10].zmm, sizeof(vals->zmm))); |
| | | 3458 | FORKEE_ASSERT(!memcmp(&vals[11].zmm, |
| | | 3459 | &expected[11].zmm, sizeof(vals->zmm))); |
| | | 3460 | FORKEE_ASSERT(!memcmp(&vals[12].zmm, |
| | | 3461 | &expected[12].zmm, sizeof(vals->zmm))); |
| | | 3462 | FORKEE_ASSERT(!memcmp(&vals[13].zmm, |
| | | 3463 | &expected[13].zmm, sizeof(vals->zmm))); |
| | | 3464 | FORKEE_ASSERT(!memcmp(&vals[14].zmm, |
| | | 3465 | &expected[14].zmm, sizeof(vals->zmm))); |
| | | 3466 | FORKEE_ASSERT(!memcmp(&vals[15].zmm, |
| | | 3467 | &expected[15].zmm, sizeof(vals->zmm))); |
| | | 3468 | FORKEE_ASSERT(!memcmp(&vals[16].zmm, |
| | | 3469 | &expected[16].zmm, sizeof(vals->zmm))); |
| | | 3470 | FORKEE_ASSERT(!memcmp(&vals[17].zmm, |
| | | 3471 | &expected[17].zmm, sizeof(vals->zmm))); |
| | | 3472 | FORKEE_ASSERT(!memcmp(&vals[18].zmm, |
| | | 3473 | &expected[18].zmm, sizeof(vals->zmm))); |
| | | 3474 | FORKEE_ASSERT(!memcmp(&vals[19].zmm, |
| | | 3475 | &expected[19].zmm, sizeof(vals->zmm))); |
| | | 3476 | FORKEE_ASSERT(!memcmp(&vals[20].zmm, |
| | | 3477 | &expected[20].zmm, sizeof(vals->zmm))); |
| | | 3478 | FORKEE_ASSERT(!memcmp(&vals[21].zmm, |
| | | 3479 | &expected[21].zmm, sizeof(vals->zmm))); |
| | | 3480 | FORKEE_ASSERT(!memcmp(&vals[22].zmm, |
| | | 3481 | &expected[22].zmm, sizeof(vals->zmm))); |
| | | 3482 | FORKEE_ASSERT(!memcmp(&vals[23].zmm, |
| | | 3483 | &expected[23].zmm, sizeof(vals->zmm))); |
| | | 3484 | FORKEE_ASSERT(!memcmp(&vals[24].zmm, |
| | | 3485 | &expected[24].zmm, sizeof(vals->zmm))); |
| | | 3486 | FORKEE_ASSERT(!memcmp(&vals[25].zmm, |
| | | 3487 | &expected[25].zmm, sizeof(vals->zmm))); |
| | | 3488 | FORKEE_ASSERT(!memcmp(&vals[26].zmm, |
| | | 3489 | &expected[26].zmm, sizeof(vals->zmm))); |
| | | 3490 | FORKEE_ASSERT(!memcmp(&vals[27].zmm, |
| | | 3491 | &expected[27].zmm, sizeof(vals->zmm))); |
| | | 3492 | FORKEE_ASSERT(!memcmp(&vals[28].zmm, |
| | | 3493 | &expected[28].zmm, sizeof(vals->zmm))); |
| | | 3494 | FORKEE_ASSERT(!memcmp(&vals[29].zmm, |
| | | 3495 | &expected[29].zmm, sizeof(vals->zmm))); |
| | | 3496 | FORKEE_ASSERT(!memcmp(&vals[30].zmm, |
| | | 3497 | &expected[30].zmm, sizeof(vals->zmm))); |
| | | 3498 | FORKEE_ASSERT(!memcmp(&vals[31].zmm, |
| | | 3499 | &expected[31].zmm, sizeof(vals->zmm))); |
| | | 3500 | #endif |
| | | 3501 | /* k0..k7 */ |
| | | 3502 | FORKEE_ASSERT(vals[32].zmm.a == expected[32].zmm.a); |
| | | 3503 | FORKEE_ASSERT(vals[32].zmm.b == expected[32].zmm.b); |
| | | 3504 | FORKEE_ASSERT(vals[32].zmm.c == expected[32].zmm.c); |
| | | 3505 | FORKEE_ASSERT(vals[32].zmm.d == expected[32].zmm.d); |
| | | 3506 | FORKEE_ASSERT(vals[32].zmm.e == expected[32].zmm.e); |
| | | 3507 | FORKEE_ASSERT(vals[32].zmm.f == expected[32].zmm.f); |
| | | 3508 | FORKEE_ASSERT(vals[32].zmm.g == expected[32].zmm.g); |
| | | 3509 | FORKEE_ASSERT(vals[32].zmm.h == expected[32].zmm.h); |
| | | 3510 | break; |
3134 | } | | 3511 | } |
3135 | break; | | 3512 | break; |
3136 | } | | 3513 | } |
3137 | | | 3514 | |
3138 | DPRINTF("Before exiting of the child process\n"); | | 3515 | DPRINTF("Before exiting of the child process\n"); |
3139 | _exit(exitval); | | 3516 | _exit(exitval); |
3140 | } | | 3517 | } |
3141 | DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); | | 3518 | DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child); |
3142 | | | 3519 | |
3143 | DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); | | 3520 | DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME); |
3144 | TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); | | 3521 | TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child); |
3145 | | | 3522 | |
3146 | validate_status_stopped(status, sigval); | | 3523 | validate_status_stopped(status, sigval); |
3147 | | | 3524 | |
3148 | if (regset == TEST_XSTATE) { | | 3525 | if (regset == TEST_XSTATE) { |
3149 | switch (regs) { | | 3526 | switch (regs) { |
3150 | case FPREGS_FPU: | | 3527 | case FPREGS_FPU: |
3151 | case FPREGS_MM: | | 3528 | case FPREGS_MM: |
3152 | xst_flags |= XCR0_X87; | | 3529 | xst_flags |= XCR0_X87; |
3153 | break; | | 3530 | break; |
| | | 3531 | case FPREGS_ZMM: |
| | | 3532 | xst_flags |= XCR0_Opmask | XCR0_ZMM_Hi256; |
| | | 3533 | #if defined(__x86_64__) |
| | | 3534 | xst_flags |= XCR0_Hi16_ZMM; |
| | | 3535 | #endif |
| | | 3536 | /*FALLTHROUGH*/ |
3154 | case FPREGS_YMM: | | 3537 | case FPREGS_YMM: |
3155 | xst_flags |= XCR0_YMM_Hi128; | | 3538 | xst_flags |= XCR0_YMM_Hi128; |
3156 | /*FALLTHROUGH*/ | | 3539 | /*FALLTHROUGH*/ |
3157 | case FPREGS_XMM: | | 3540 | case FPREGS_XMM: |
3158 | xst_flags |= XCR0_SSE; | | 3541 | xst_flags |= XCR0_SSE; |
3159 | break; | | 3542 | break; |
3160 | case GPREGS_32: | | 3543 | case GPREGS_32: |
3161 | case GPREGS_32_EBP_ESP: | | 3544 | case GPREGS_32_EBP_ESP: |
3162 | case GPREGS_64: | | 3545 | case GPREGS_64: |
3163 | case GPREGS_64_R8: | | 3546 | case GPREGS_64_R8: |
3164 | __unreachable(); | | 3547 | __unreachable(); |
3165 | break; | | 3548 | break; |
3166 | } | | 3549 | } |
| @@ -3417,26 +3800,105 @@ x86_register_test(enum x86_test_regset r | | | @@ -3417,26 +3800,105 @@ x86_register_test(enum x86_test_regset r |
3417 | ATF_CHECK_EQ(ST_EXP(7), expected_fpu.st[7].sign_exp); | | 3800 | ATF_CHECK_EQ(ST_EXP(7), expected_fpu.st[7].sign_exp); |
3418 | ATF_CHECK_EQ(ST_MAN(7), expected_fpu.st[7].mantissa); | | 3801 | ATF_CHECK_EQ(ST_MAN(7), expected_fpu.st[7].mantissa); |
3419 | break; | | 3802 | break; |
3420 | case FPREGS_MM: | | 3803 | case FPREGS_MM: |
3421 | ATF_CHECK_EQ(ST_MAN(0), expected[0].u64); | | 3804 | ATF_CHECK_EQ(ST_MAN(0), expected[0].u64); |
3422 | ATF_CHECK_EQ(ST_MAN(1), expected[1].u64); | | 3805 | ATF_CHECK_EQ(ST_MAN(1), expected[1].u64); |
3423 | ATF_CHECK_EQ(ST_MAN(2), expected[2].u64); | | 3806 | ATF_CHECK_EQ(ST_MAN(2), expected[2].u64); |
3424 | ATF_CHECK_EQ(ST_MAN(3), expected[3].u64); | | 3807 | ATF_CHECK_EQ(ST_MAN(3), expected[3].u64); |
3425 | ATF_CHECK_EQ(ST_MAN(4), expected[4].u64); | | 3808 | ATF_CHECK_EQ(ST_MAN(4), expected[4].u64); |
3426 | ATF_CHECK_EQ(ST_MAN(5), expected[5].u64); | | 3809 | ATF_CHECK_EQ(ST_MAN(5), expected[5].u64); |
3427 | ATF_CHECK_EQ(ST_MAN(6), expected[6].u64); | | 3810 | ATF_CHECK_EQ(ST_MAN(6), expected[6].u64); |
3428 | ATF_CHECK_EQ(ST_MAN(7), expected[7].u64); | | 3811 | ATF_CHECK_EQ(ST_MAN(7), expected[7].u64); |
3429 | break; | | 3812 | break; |
| | | 3813 | case FPREGS_ZMM: |
| | | 3814 | /* zmm0..zmm15 are split between xmm, ymm_hi128 and zmm_hi256 */ |
| | | 3815 | ATF_CHECK(!memcmp(&xst.xs_zmm_hi256.xs_zmm[0], |
| | | 3816 | &expected[0].zmm.e, sizeof(expected->zmm)/2)); |
| | | 3817 | ATF_CHECK(!memcmp(&xst.xs_zmm_hi256.xs_zmm[1], |
| | | 3818 | &expected[1].zmm.e, sizeof(expected->zmm)/2)); |
| | | 3819 | ATF_CHECK(!memcmp(&xst.xs_zmm_hi256.xs_zmm[2], |
| | | 3820 | &expected[2].zmm.e, sizeof(expected->zmm)/2)); |
| | | 3821 | ATF_CHECK(!memcmp(&xst.xs_zmm_hi256.xs_zmm[3], |
| | | 3822 | &expected[3].zmm.e, sizeof(expected->zmm)/2)); |
| | | 3823 | ATF_CHECK(!memcmp(&xst.xs_zmm_hi256.xs_zmm[4], |
| | | 3824 | &expected[4].zmm.e, sizeof(expected->zmm)/2)); |
| | | 3825 | ATF_CHECK(!memcmp(&xst.xs_zmm_hi256.xs_zmm[5], |
| | | 3826 | &expected[5].zmm.e, sizeof(expected->zmm)/2)); |
| | | 3827 | ATF_CHECK(!memcmp(&xst.xs_zmm_hi256.xs_zmm[6], |
| | | 3828 | &expected[6].zmm.e, sizeof(expected->zmm)/2)); |
| | | 3829 | ATF_CHECK(!memcmp(&xst.xs_zmm_hi256.xs_zmm[7], |
| | | 3830 | &expected[7].zmm.e, sizeof(expected->zmm)/2)); |
| | | 3831 | #if defined(__x86_64__) |
| | | 3832 | ATF_CHECK(!memcmp(&xst.xs_zmm_hi256.xs_zmm[8], |
| | | 3833 | &expected[8].zmm.e, sizeof(expected->zmm)/2)); |
| | | 3834 | ATF_CHECK(!memcmp(&xst.xs_zmm_hi256.xs_zmm[9], |
| | | 3835 | &expected[9].zmm.e, sizeof(expected->zmm)/2)); |
| | | 3836 | ATF_CHECK(!memcmp(&xst.xs_zmm_hi256.xs_zmm[10], |
| | | 3837 | &expected[10].zmm.e, sizeof(expected->zmm)/2)); |
| | | 3838 | ATF_CHECK(!memcmp(&xst.xs_zmm_hi256.xs_zmm[11], |
| | | 3839 | &expected[11].zmm.e, sizeof(expected->zmm)/2)); |
| | | 3840 | ATF_CHECK(!memcmp(&xst.xs_zmm_hi256.xs_zmm[12], |
| | | 3841 | &expected[12].zmm.e, sizeof(expected->zmm)/2)); |
| | | 3842 | ATF_CHECK(!memcmp(&xst.xs_zmm_hi256.xs_zmm[13], |
| | | 3843 | &expected[13].zmm.e, sizeof(expected->zmm)/2)); |
| | | 3844 | ATF_CHECK(!memcmp(&xst.xs_zmm_hi256.xs_zmm[14], |
| | | 3845 | &expected[14].zmm.e, sizeof(expected->zmm)/2)); |
| | | 3846 | ATF_CHECK(!memcmp(&xst.xs_zmm_hi256.xs_zmm[15], |
| | | 3847 | &expected[15].zmm.e, sizeof(expected->zmm)/2)); |
| | | 3848 | /* zmm16..zmm31 are stored as a whole */ |
| | | 3849 | ATF_CHECK(!memcmp(&xst.xs_hi16_zmm.xs_hi16_zmm[0], |
| | | 3850 | &expected[16].zmm, sizeof(expected->zmm))); |
| | | 3851 | ATF_CHECK(!memcmp(&xst.xs_hi16_zmm.xs_hi16_zmm[1], |
| | | 3852 | &expected[17].zmm, sizeof(expected->zmm))); |
| | | 3853 | ATF_CHECK(!memcmp(&xst.xs_hi16_zmm.xs_hi16_zmm[2], |
| | | 3854 | &expected[18].zmm, sizeof(expected->zmm))); |
| | | 3855 | ATF_CHECK(!memcmp(&xst.xs_hi16_zmm.xs_hi16_zmm[3], |
| | | 3856 | &expected[19].zmm, sizeof(expected->zmm))); |
| | | 3857 | ATF_CHECK(!memcmp(&xst.xs_hi16_zmm.xs_hi16_zmm[4], |
| | | 3858 | &expected[20].zmm, sizeof(expected->zmm))); |
| | | 3859 | ATF_CHECK(!memcmp(&xst.xs_hi16_zmm.xs_hi16_zmm[5], |
| | | 3860 | &expected[21].zmm, sizeof(expected->zmm))); |
| | | 3861 | ATF_CHECK(!memcmp(&xst.xs_hi16_zmm.xs_hi16_zmm[6], |
| | | 3862 | &expected[22].zmm, sizeof(expected->zmm))); |
| | | 3863 | ATF_CHECK(!memcmp(&xst.xs_hi16_zmm.xs_hi16_zmm[7], |
| | | 3864 | &expected[23].zmm, sizeof(expected->zmm))); |
| | | 3865 | ATF_CHECK(!memcmp(&xst.xs_hi16_zmm.xs_hi16_zmm[8], |
| | | 3866 | &expected[24].zmm, sizeof(expected->zmm))); |
| | | 3867 | ATF_CHECK(!memcmp(&xst.xs_hi16_zmm.xs_hi16_zmm[9], |
| | | 3868 | &expected[25].zmm, sizeof(expected->zmm))); |
| | | 3869 | ATF_CHECK(!memcmp(&xst.xs_hi16_zmm.xs_hi16_zmm[10], |
| | | 3870 | &expected[26].zmm, sizeof(expected->zmm))); |
| | | 3871 | ATF_CHECK(!memcmp(&xst.xs_hi16_zmm.xs_hi16_zmm[11], |
| | | 3872 | &expected[27].zmm, sizeof(expected->zmm))); |
| | | 3873 | ATF_CHECK(!memcmp(&xst.xs_hi16_zmm.xs_hi16_zmm[12], |
| | | 3874 | &expected[28].zmm, sizeof(expected->zmm))); |
| | | 3875 | ATF_CHECK(!memcmp(&xst.xs_hi16_zmm.xs_hi16_zmm[13], |
| | | 3876 | &expected[29].zmm, sizeof(expected->zmm))); |
| | | 3877 | ATF_CHECK(!memcmp(&xst.xs_hi16_zmm.xs_hi16_zmm[14], |
| | | 3878 | &expected[30].zmm, sizeof(expected->zmm))); |
| | | 3879 | ATF_CHECK(!memcmp(&xst.xs_hi16_zmm.xs_hi16_zmm[15], |
| | | 3880 | &expected[31].zmm, sizeof(expected->zmm))); |
| | | 3881 | #endif |
| | | 3882 | /* k0..k7 */ |
| | | 3883 | ATF_CHECK(xst.xs_opmask.xs_k[0] == expected[32].zmm.a); |
| | | 3884 | ATF_CHECK(xst.xs_opmask.xs_k[1] == expected[32].zmm.b); |
| | | 3885 | ATF_CHECK(xst.xs_opmask.xs_k[2] == expected[32].zmm.c); |
| | | 3886 | ATF_CHECK(xst.xs_opmask.xs_k[3] == expected[32].zmm.d); |
| | | 3887 | ATF_CHECK(xst.xs_opmask.xs_k[4] == expected[32].zmm.e); |
| | | 3888 | ATF_CHECK(xst.xs_opmask.xs_k[5] == expected[32].zmm.f); |
| | | 3889 | ATF_CHECK(xst.xs_opmask.xs_k[6] == expected[32].zmm.g); |
| | | 3890 | ATF_CHECK(xst.xs_opmask.xs_k[7] == expected[32].zmm.h); |
| | | 3891 | /*FALLTHROUGH*/ |
3430 | case FPREGS_YMM: | | 3892 | case FPREGS_YMM: |
3431 | ATF_CHECK(!memcmp(&xst.xs_ymm_hi128.xs_ymm[0], | | 3893 | ATF_CHECK(!memcmp(&xst.xs_ymm_hi128.xs_ymm[0], |
3432 | &expected[0].ymm.c, sizeof(expected->ymm)/2)); | | 3894 | &expected[0].ymm.c, sizeof(expected->ymm)/2)); |
3433 | ATF_CHECK(!memcmp(&xst.xs_ymm_hi128.xs_ymm[1], | | 3895 | ATF_CHECK(!memcmp(&xst.xs_ymm_hi128.xs_ymm[1], |
3434 | &expected[1].ymm.c, sizeof(expected->ymm)/2)); | | 3896 | &expected[1].ymm.c, sizeof(expected->ymm)/2)); |
3435 | ATF_CHECK(!memcmp(&xst.xs_ymm_hi128.xs_ymm[2], | | 3897 | ATF_CHECK(!memcmp(&xst.xs_ymm_hi128.xs_ymm[2], |
3436 | &expected[2].ymm.c, sizeof(expected->ymm)/2)); | | 3898 | &expected[2].ymm.c, sizeof(expected->ymm)/2)); |
3437 | ATF_CHECK(!memcmp(&xst.xs_ymm_hi128.xs_ymm[3], | | 3899 | ATF_CHECK(!memcmp(&xst.xs_ymm_hi128.xs_ymm[3], |
3438 | &expected[3].ymm.c, sizeof(expected->ymm)/2)); | | 3900 | &expected[3].ymm.c, sizeof(expected->ymm)/2)); |
3439 | ATF_CHECK(!memcmp(&xst.xs_ymm_hi128.xs_ymm[4], | | 3901 | ATF_CHECK(!memcmp(&xst.xs_ymm_hi128.xs_ymm[4], |
3440 | &expected[4].ymm.c, sizeof(expected->ymm)/2)); | | 3902 | &expected[4].ymm.c, sizeof(expected->ymm)/2)); |
3441 | ATF_CHECK(!memcmp(&xst.xs_ymm_hi128.xs_ymm[5], | | 3903 | ATF_CHECK(!memcmp(&xst.xs_ymm_hi128.xs_ymm[5], |
3442 | &expected[5].ymm.c, sizeof(expected->ymm)/2)); | | 3904 | &expected[5].ymm.c, sizeof(expected->ymm)/2)); |
| @@ -3582,26 +4044,105 @@ x86_register_test(enum x86_test_regset r | | | @@ -3582,26 +4044,105 @@ x86_register_test(enum x86_test_regset r |
3582 | ST_EXP(7) = expected_fpu.st[7].sign_exp; | | 4044 | ST_EXP(7) = expected_fpu.st[7].sign_exp; |
3583 | ST_MAN(7) = expected_fpu.st[7].mantissa; | | 4045 | ST_MAN(7) = expected_fpu.st[7].mantissa; |
3584 | break; | | 4046 | break; |
3585 | case FPREGS_MM: | | 4047 | case FPREGS_MM: |
3586 | ST_MAN(0) = expected[0].u64; | | 4048 | ST_MAN(0) = expected[0].u64; |
3587 | ST_MAN(1) = expected[1].u64; | | 4049 | ST_MAN(1) = expected[1].u64; |
3588 | ST_MAN(2) = expected[2].u64; | | 4050 | ST_MAN(2) = expected[2].u64; |
3589 | ST_MAN(3) = expected[3].u64; | | 4051 | ST_MAN(3) = expected[3].u64; |
3590 | ST_MAN(4) = expected[4].u64; | | 4052 | ST_MAN(4) = expected[4].u64; |
3591 | ST_MAN(5) = expected[5].u64; | | 4053 | ST_MAN(5) = expected[5].u64; |
3592 | ST_MAN(6) = expected[6].u64; | | 4054 | ST_MAN(6) = expected[6].u64; |
3593 | ST_MAN(7) = expected[7].u64; | | 4055 | ST_MAN(7) = expected[7].u64; |
3594 | break; | | 4056 | break; |
| | | 4057 | case FPREGS_ZMM: |
| | | 4058 | /* zmm0..zmm15 are split between xmm, ymm_hi128, zmm_hi256 */ |
| | | 4059 | memcpy(&xst.xs_zmm_hi256.xs_zmm[0], |
| | | 4060 | &expected[0].zmm.e, sizeof(expected->zmm)/2); |
| | | 4061 | memcpy(&xst.xs_zmm_hi256.xs_zmm[1], |
| | | 4062 | &expected[1].zmm.e, sizeof(expected->zmm)/2); |
| | | 4063 | memcpy(&xst.xs_zmm_hi256.xs_zmm[2], |
| | | 4064 | &expected[2].zmm.e, sizeof(expected->zmm)/2); |
| | | 4065 | memcpy(&xst.xs_zmm_hi256.xs_zmm[3], |
| | | 4066 | &expected[3].zmm.e, sizeof(expected->zmm)/2); |
| | | 4067 | memcpy(&xst.xs_zmm_hi256.xs_zmm[4], |
| | | 4068 | &expected[4].zmm.e, sizeof(expected->zmm)/2); |
| | | 4069 | memcpy(&xst.xs_zmm_hi256.xs_zmm[5], |
| | | 4070 | &expected[5].zmm.e, sizeof(expected->zmm)/2); |
| | | 4071 | memcpy(&xst.xs_zmm_hi256.xs_zmm[6], |
| | | 4072 | &expected[6].zmm.e, sizeof(expected->zmm)/2); |
| | | 4073 | memcpy(&xst.xs_zmm_hi256.xs_zmm[7], |
| | | 4074 | &expected[7].zmm.e, sizeof(expected->zmm)/2); |
| | | 4075 | #if defined(__x86_64__) |
| | | 4076 | memcpy(&xst.xs_zmm_hi256.xs_zmm[8], |
| | | 4077 | &expected[8].zmm.e, sizeof(expected->zmm)/2); |
| | | 4078 | memcpy(&xst.xs_zmm_hi256.xs_zmm[9], |
| | | 4079 | &expected[9].zmm.e, sizeof(expected->zmm)/2); |
| | | 4080 | memcpy(&xst.xs_zmm_hi256.xs_zmm[10], |
| | | 4081 | &expected[10].zmm.e, sizeof(expected->zmm)/2); |
| | | 4082 | memcpy(&xst.xs_zmm_hi256.xs_zmm[11], |
| | | 4083 | &expected[11].zmm.e, sizeof(expected->zmm)/2); |
| | | 4084 | memcpy(&xst.xs_zmm_hi256.xs_zmm[12], |
| | | 4085 | &expected[12].zmm.e, sizeof(expected->zmm)/2); |
| | | 4086 | memcpy(&xst.xs_zmm_hi256.xs_zmm[13], |
| | | 4087 | &expected[13].zmm.e, sizeof(expected->zmm)/2); |
| | | 4088 | memcpy(&xst.xs_zmm_hi256.xs_zmm[14], |
| | | 4089 | &expected[14].zmm.e, sizeof(expected->zmm)/2); |
| | | 4090 | memcpy(&xst.xs_zmm_hi256.xs_zmm[15], |
| | | 4091 | &expected[15].zmm.e, sizeof(expected->zmm)/2); |
| | | 4092 | /* zmm16..zmm31 are stored as a whole */ |
| | | 4093 | memcpy(&xst.xs_hi16_zmm.xs_hi16_zmm[0], |
| | | 4094 | &expected[16].zmm, sizeof(expected->zmm)); |
| | | 4095 | memcpy(&xst.xs_hi16_zmm.xs_hi16_zmm[1], |
| | | 4096 | &expected[17].zmm, sizeof(expected->zmm)); |
| | | 4097 | memcpy(&xst.xs_hi16_zmm.xs_hi16_zmm[2], |
| | | 4098 | &expected[18].zmm, sizeof(expected->zmm)); |
| | | 4099 | memcpy(&xst.xs_hi16_zmm.xs_hi16_zmm[3], |
| | | 4100 | &expected[19].zmm, sizeof(expected->zmm)); |
| | | 4101 | memcpy(&xst.xs_hi16_zmm.xs_hi16_zmm[4], |
| | | 4102 | &expected[20].zmm, sizeof(expected->zmm)); |
| | | 4103 | memcpy(&xst.xs_hi16_zmm.xs_hi16_zmm[5], |
| | | 4104 | &expected[21].zmm, sizeof(expected->zmm)); |
| | | 4105 | memcpy(&xst.xs_hi16_zmm.xs_hi16_zmm[6], |
| | | 4106 | &expected[22].zmm, sizeof(expected->zmm)); |
| | | 4107 | memcpy(&xst.xs_hi16_zmm.xs_hi16_zmm[7], |
| | | 4108 | &expected[23].zmm, sizeof(expected->zmm)); |
| | | 4109 | memcpy(&xst.xs_hi16_zmm.xs_hi16_zmm[8], |
| | | 4110 | &expected[24].zmm, sizeof(expected->zmm)); |
| | | 4111 | memcpy(&xst.xs_hi16_zmm.xs_hi16_zmm[9], |
| | | 4112 | &expected[25].zmm, sizeof(expected->zmm)); |
| | | 4113 | memcpy(&xst.xs_hi16_zmm.xs_hi16_zmm[10], |
| | | 4114 | &expected[26].zmm, sizeof(expected->zmm)); |
| | | 4115 | memcpy(&xst.xs_hi16_zmm.xs_hi16_zmm[11], |
| | | 4116 | &expected[27].zmm, sizeof(expected->zmm)); |
| | | 4117 | memcpy(&xst.xs_hi16_zmm.xs_hi16_zmm[12], |
| | | 4118 | &expected[28].zmm, sizeof(expected->zmm)); |
| | | 4119 | memcpy(&xst.xs_hi16_zmm.xs_hi16_zmm[13], |
| | | 4120 | &expected[29].zmm, sizeof(expected->zmm)); |
| | | 4121 | memcpy(&xst.xs_hi16_zmm.xs_hi16_zmm[14], |
| | | 4122 | &expected[30].zmm, sizeof(expected->zmm)); |
| | | 4123 | memcpy(&xst.xs_hi16_zmm.xs_hi16_zmm[15], |
| | | 4124 | &expected[31].zmm, sizeof(expected->zmm)); |
| | | 4125 | #endif |
| | | 4126 | /* k0..k7 */ |
| | | 4127 | xst.xs_opmask.xs_k[0] = expected[32].zmm.a; |
| | | 4128 | xst.xs_opmask.xs_k[1] = expected[32].zmm.b; |
| | | 4129 | xst.xs_opmask.xs_k[2] = expected[32].zmm.c; |
| | | 4130 | xst.xs_opmask.xs_k[3] = expected[32].zmm.d; |
| | | 4131 | xst.xs_opmask.xs_k[4] = expected[32].zmm.e; |
| | | 4132 | xst.xs_opmask.xs_k[5] = expected[32].zmm.f; |
| | | 4133 | xst.xs_opmask.xs_k[6] = expected[32].zmm.g; |
| | | 4134 | xst.xs_opmask.xs_k[7] = expected[32].zmm.h; |
| | | 4135 | /*FALLTHROUGH*/ |
3595 | case FPREGS_YMM: | | 4136 | case FPREGS_YMM: |
3596 | memcpy(&xst.xs_ymm_hi128.xs_ymm[0], | | 4137 | memcpy(&xst.xs_ymm_hi128.xs_ymm[0], |
3597 | &expected[0].ymm.c, sizeof(expected->ymm)/2); | | 4138 | &expected[0].ymm.c, sizeof(expected->ymm)/2); |
3598 | memcpy(&xst.xs_ymm_hi128.xs_ymm[1], | | 4139 | memcpy(&xst.xs_ymm_hi128.xs_ymm[1], |
3599 | &expected[1].ymm.c, sizeof(expected->ymm)/2); | | 4140 | &expected[1].ymm.c, sizeof(expected->ymm)/2); |
3600 | memcpy(&xst.xs_ymm_hi128.xs_ymm[2], | | 4141 | memcpy(&xst.xs_ymm_hi128.xs_ymm[2], |
3601 | &expected[2].ymm.c, sizeof(expected->ymm)/2); | | 4142 | &expected[2].ymm.c, sizeof(expected->ymm)/2); |
3602 | memcpy(&xst.xs_ymm_hi128.xs_ymm[3], | | 4143 | memcpy(&xst.xs_ymm_hi128.xs_ymm[3], |
3603 | &expected[3].ymm.c, sizeof(expected->ymm)/2); | | 4144 | &expected[3].ymm.c, sizeof(expected->ymm)/2); |
3604 | memcpy(&xst.xs_ymm_hi128.xs_ymm[4], | | 4145 | memcpy(&xst.xs_ymm_hi128.xs_ymm[4], |
3605 | &expected[4].ymm.c, sizeof(expected->ymm)/2); | | 4146 | &expected[4].ymm.c, sizeof(expected->ymm)/2); |
3606 | memcpy(&xst.xs_ymm_hi128.xs_ymm[5], | | 4147 | memcpy(&xst.xs_ymm_hi128.xs_ymm[5], |
3607 | &expected[5].ymm.c, sizeof(expected->ymm)/2); | | 4148 | &expected[5].ymm.c, sizeof(expected->ymm)/2); |
| @@ -3799,26 +4340,35 @@ X86_REGISTER_TEST(x86_xstate_xmm_read, T | | | @@ -3799,26 +4340,35 @@ X86_REGISTER_TEST(x86_xstate_xmm_read, T |
3799 | X86_REGISTER_TEST(x86_xstate_xmm_write, TEST_XSTATE, FPREGS_XMM, TEST_SETREGS, | | 4340 | X86_REGISTER_TEST(x86_xstate_xmm_write, TEST_XSTATE, FPREGS_XMM, TEST_SETREGS, |
3800 | "Test writing xmm0..xmm15 (..xmm7 on i386) into debugged program " | | 4341 | "Test writing xmm0..xmm15 (..xmm7 on i386) into debugged program " |
3801 | "via PT_SETXSTATE."); | | 4342 | "via PT_SETXSTATE."); |
3802 | X86_REGISTER_TEST(x86_xstate_xmm_core, TEST_XSTATE, FPREGS_XMM, TEST_COREDUMP, | | 4343 | X86_REGISTER_TEST(x86_xstate_xmm_core, TEST_XSTATE, FPREGS_XMM, TEST_COREDUMP, |
3803 | "Test reading xmm0..xmm15 (..xmm7 on i386) from coredump via XSTATE note."); | | 4344 | "Test reading xmm0..xmm15 (..xmm7 on i386) from coredump via XSTATE note."); |
3804 | X86_REGISTER_TEST(x86_xstate_ymm_read, TEST_XSTATE, FPREGS_YMM, TEST_GETREGS, | | 4345 | X86_REGISTER_TEST(x86_xstate_ymm_read, TEST_XSTATE, FPREGS_YMM, TEST_GETREGS, |
3805 | "Test reading ymm0..ymm15 (..ymm7 on i386) from debugged program " | | 4346 | "Test reading ymm0..ymm15 (..ymm7 on i386) from debugged program " |
3806 | "via PT_GETXSTATE."); | | 4347 | "via PT_GETXSTATE."); |
3807 | X86_REGISTER_TEST(x86_xstate_ymm_write, TEST_XSTATE, FPREGS_YMM, TEST_SETREGS, | | 4348 | X86_REGISTER_TEST(x86_xstate_ymm_write, TEST_XSTATE, FPREGS_YMM, TEST_SETREGS, |
3808 | "Test writing ymm0..ymm15 (..ymm7 on i386) into debugged program " | | 4349 | "Test writing ymm0..ymm15 (..ymm7 on i386) into debugged program " |
3809 | "via PT_SETXSTATE."); | | 4350 | "via PT_SETXSTATE."); |
3810 | X86_REGISTER_TEST(x86_xstate_ymm_core, TEST_XSTATE, FPREGS_YMM, TEST_COREDUMP, | | 4351 | X86_REGISTER_TEST(x86_xstate_ymm_core, TEST_XSTATE, FPREGS_YMM, TEST_COREDUMP, |
3811 | "Test reading ymm0..ymm15 (..ymm7 on i386) from coredump via XSTATE note."); | | 4352 | "Test reading ymm0..ymm15 (..ymm7 on i386) from coredump via XSTATE note."); |
| | | 4353 | X86_REGISTER_TEST(x86_xstate_zmm_read, TEST_XSTATE, FPREGS_ZMM, TEST_GETREGS, |
| | | 4354 | "Test reading zmm0..zmm31 (..zmm7 on i386), k0..k7 from debugged program " |
| | | 4355 | "via PT_GETXSTATE."); |
| | | 4356 | X86_REGISTER_TEST(x86_xstate_zmm_write, TEST_XSTATE, FPREGS_ZMM, TEST_SETREGS, |
| | | 4357 | "Test writing zmm0..zmm31 (..zmm7 on i386), k0..k7 into debugged program " |
| | | 4358 | "via PT_SETXSTATE."); |
| | | 4359 | X86_REGISTER_TEST(x86_xstate_zmm_core, TEST_XSTATE, FPREGS_ZMM, TEST_COREDUMP, |
| | | 4360 | "Test reading zmm0..zmm31 (..zmm7 on i386), k0..k7 from coredump " |
| | | 4361 | "via XSTATE note."); |
3812 | | | 4362 | |
3813 | /// ---------------------------------------------------------------------------- | | 4363 | /// ---------------------------------------------------------------------------- |
3814 | | | 4364 | |
3815 | #if defined(TWAIT_HAVE_STATUS) | | 4365 | #if defined(TWAIT_HAVE_STATUS) |
3816 | | | 4366 | |
3817 | static void | | 4367 | static void |
3818 | thread_concurrent_lwp_setup(pid_t child, lwpid_t lwpid) | | 4368 | thread_concurrent_lwp_setup(pid_t child, lwpid_t lwpid) |
3819 | { | | 4369 | { |
3820 | struct dbreg r; | | 4370 | struct dbreg r; |
3821 | union u dr7; | | 4371 | union u dr7; |
3822 | | | 4372 | |
3823 | /* We need to set debug registers for every child */ | | 4373 | /* We need to set debug registers for every child */ |
3824 | DPRINTF("Call GETDBREGS for LWP %d\n", lwpid); | | 4374 | DPRINTF("Call GETDBREGS for LWP %d\n", lwpid); |
| @@ -3985,17 +4535,20 @@ thread_concurrent_handle_sigtrap(pid_t c | | | @@ -3985,17 +4535,20 @@ thread_concurrent_handle_sigtrap(pid_t c |
3985 | ATF_TP_ADD_TC(tp, x86_fpregs_xmm_write); \ | | 4535 | ATF_TP_ADD_TC(tp, x86_fpregs_xmm_write); \ |
3986 | ATF_TP_ADD_TC(tp, x86_fpregs_xmm_core); \ | | 4536 | ATF_TP_ADD_TC(tp, x86_fpregs_xmm_core); \ |
3987 | ATF_TP_ADD_TC(tp, x86_xstate_fpu_read); \ | | 4537 | ATF_TP_ADD_TC(tp, x86_xstate_fpu_read); \ |
3988 | ATF_TP_ADD_TC(tp, x86_xstate_fpu_write); \ | | 4538 | ATF_TP_ADD_TC(tp, x86_xstate_fpu_write); \ |
3989 | ATF_TP_ADD_TC(tp, x86_xstate_fpu_core); \ | | 4539 | ATF_TP_ADD_TC(tp, x86_xstate_fpu_core); \ |
3990 | ATF_TP_ADD_TC(tp, x86_xstate_mm_read); \ | | 4540 | ATF_TP_ADD_TC(tp, x86_xstate_mm_read); \ |
3991 | ATF_TP_ADD_TC(tp, x86_xstate_mm_write); \ | | 4541 | ATF_TP_ADD_TC(tp, x86_xstate_mm_write); \ |
3992 | ATF_TP_ADD_TC(tp, x86_xstate_mm_core); \ | | 4542 | ATF_TP_ADD_TC(tp, x86_xstate_mm_core); \ |
3993 | ATF_TP_ADD_TC(tp, x86_xstate_xmm_read); \ | | 4543 | ATF_TP_ADD_TC(tp, x86_xstate_xmm_read); \ |
3994 | ATF_TP_ADD_TC(tp, x86_xstate_xmm_write); \ | | 4544 | ATF_TP_ADD_TC(tp, x86_xstate_xmm_write); \ |
3995 | ATF_TP_ADD_TC(tp, x86_xstate_xmm_core); \ | | 4545 | ATF_TP_ADD_TC(tp, x86_xstate_xmm_core); \ |
3996 | ATF_TP_ADD_TC(tp, x86_xstate_ymm_read); \ | | 4546 | ATF_TP_ADD_TC(tp, x86_xstate_ymm_read); \ |
3997 | ATF_TP_ADD_TC(tp, x86_xstate_ymm_write); \ | | 4547 | ATF_TP_ADD_TC(tp, x86_xstate_ymm_write); \ |
3998 | ATF_TP_ADD_TC(tp, x86_xstate_ymm_core); | | 4548 | ATF_TP_ADD_TC(tp, x86_xstate_ymm_core); \ |
| | | 4549 | ATF_TP_ADD_TC(tp, x86_xstate_zmm_read); \ |
| | | 4550 | ATF_TP_ADD_TC(tp, x86_xstate_zmm_write); \ |
| | | 4551 | ATF_TP_ADD_TC(tp, x86_xstate_zmm_core); |
3999 | #else | | 4552 | #else |
4000 | #define ATF_TP_ADD_TCS_PTRACE_WAIT_X86() | | 4553 | #define ATF_TP_ADD_TCS_PTRACE_WAIT_X86() |
4001 | #endif | | 4554 | #endif |