1 /* Test program for PKEYS registers.
3 Copyright 2015-2024 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 #include "x86-cpuid.h"
24 #define NOINLINE __attribute__ ((noinline))
27 unsigned int have_pkru (void) NOINLINE
;
29 static inline unsigned long
32 unsigned int eax
, edx
;
36 asm volatile (".byte 0x0f,0x01,0xee\n\t"
37 : "=a" (eax
), "=d" (edx
)
44 wrpkru (unsigned int pkru
)
46 unsigned int eax
= pkru
;
50 asm volatile (".byte 0x0f,0x01,0xef\n\t"
51 : : "a" (eax
), "c" (ecx
), "d" (edx
));
57 unsigned int eax
, ebx
, ecx
, edx
;
59 if (!__get_cpuid (1, &eax
, &ebx
, &ecx
, &edx
))
62 if ((ecx
& bit_OSXSAVE
) == bit_OSXSAVE
)
64 if (__get_cpuid_max (0, NULL
) < 7)
67 __cpuid_count (7, 0, eax
, ebx
, ecx
, edx
);
69 if ((ecx
& bit_PKU
) == bit_PKU
)
76 main (int argc
, char **argv
)
78 unsigned int wr_value
= 0x12345678;
79 unsigned int rd_value
= 0x0;
84 asm ("nop\n\t"); /* break here 1. */
87 asm ("nop\n\t"); /* break here 2. */