4444
4545#include "tls.h"
4646
47- enum x86_regset {
48- REGSET_GENERAL ,
49- REGSET_FP ,
50- REGSET_XFP ,
51- REGSET_IOPERM64 = REGSET_XFP ,
52- REGSET_XSTATE ,
53- REGSET_TLS ,
54- REGSET_IOPERM32 ,
47+ enum x86_regset_32 {
48+ REGSET32_GENERAL ,
49+ REGSET32_FP ,
50+ REGSET32_XFP ,
51+ REGSET32_XSTATE ,
52+ REGSET32_TLS ,
53+ REGSET32_IOPERM ,
5554};
5655
56+ enum x86_regset_64 {
57+ REGSET64_GENERAL ,
58+ REGSET64_FP ,
59+ REGSET64_IOPERM ,
60+ REGSET64_XSTATE ,
61+ };
62+
63+ #define REGSET_GENERAL \
64+ ({ \
65+ BUILD_BUG_ON((int)REGSET32_GENERAL != (int)REGSET64_GENERAL); \
66+ REGSET32_GENERAL; \
67+ })
68+
69+ #define REGSET_FP \
70+ ({ \
71+ BUILD_BUG_ON((int)REGSET32_FP != (int)REGSET64_FP); \
72+ REGSET32_FP; \
73+ })
74+
75+
5776struct pt_regs_offset {
5877 const char * name ;
5978 int offset ;
@@ -788,13 +807,13 @@ long arch_ptrace(struct task_struct *child, long request,
788807#ifdef CONFIG_X86_32
789808 case PTRACE_GETFPXREGS : /* Get the child extended FPU state. */
790809 return copy_regset_to_user (child , & user_x86_32_view ,
791- REGSET_XFP ,
810+ REGSET32_XFP ,
792811 0 , sizeof (struct user_fxsr_struct ),
793812 datap ) ? - EIO : 0 ;
794813
795814 case PTRACE_SETFPXREGS : /* Set the child extended FPU state. */
796815 return copy_regset_from_user (child , & user_x86_32_view ,
797- REGSET_XFP ,
816+ REGSET32_XFP ,
798817 0 , sizeof (struct user_fxsr_struct ),
799818 datap ) ? - EIO : 0 ;
800819#endif
@@ -1086,13 +1105,13 @@ static long ia32_arch_ptrace(struct task_struct *child, compat_long_t request,
10861105
10871106 case PTRACE_GETFPXREGS : /* Get the child extended FPU state. */
10881107 return copy_regset_to_user (child , & user_x86_32_view ,
1089- REGSET_XFP , 0 ,
1108+ REGSET32_XFP , 0 ,
10901109 sizeof (struct user32_fxsr_struct ),
10911110 datap );
10921111
10931112 case PTRACE_SETFPXREGS : /* Set the child extended FPU state. */
10941113 return copy_regset_from_user (child , & user_x86_32_view ,
1095- REGSET_XFP , 0 ,
1114+ REGSET32_XFP , 0 ,
10961115 sizeof (struct user32_fxsr_struct ),
10971116 datap );
10981117
@@ -1215,29 +1234,38 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
12151234#ifdef CONFIG_X86_64
12161235
12171236static struct user_regset x86_64_regsets [] __ro_after_init = {
1218- [REGSET_GENERAL ] = {
1219- .core_note_type = NT_PRSTATUS ,
1220- .n = sizeof (struct user_regs_struct ) / sizeof (long ),
1221- .size = sizeof (long ), .align = sizeof (long ),
1222- .regset_get = genregs_get , .set = genregs_set
1237+ [REGSET64_GENERAL ] = {
1238+ .core_note_type = NT_PRSTATUS ,
1239+ .n = sizeof (struct user_regs_struct ) / sizeof (long ),
1240+ .size = sizeof (long ),
1241+ .align = sizeof (long ),
1242+ .regset_get = genregs_get ,
1243+ .set = genregs_set
12231244 },
1224- [REGSET_FP ] = {
1225- .core_note_type = NT_PRFPREG ,
1226- .n = sizeof (struct fxregs_state ) / sizeof (long ),
1227- .size = sizeof (long ), .align = sizeof (long ),
1228- .active = regset_xregset_fpregs_active , .regset_get = xfpregs_get , .set = xfpregs_set
1245+ [REGSET64_FP ] = {
1246+ .core_note_type = NT_PRFPREG ,
1247+ .n = sizeof (struct fxregs_state ) / sizeof (long ),
1248+ .size = sizeof (long ),
1249+ .align = sizeof (long ),
1250+ .active = regset_xregset_fpregs_active ,
1251+ .regset_get = xfpregs_get ,
1252+ .set = xfpregs_set
12291253 },
1230- [REGSET_XSTATE ] = {
1231- .core_note_type = NT_X86_XSTATE ,
1232- .size = sizeof (u64 ), .align = sizeof (u64 ),
1233- .active = xstateregs_active , .regset_get = xstateregs_get ,
1234- .set = xstateregs_set
1254+ [REGSET64_XSTATE ] = {
1255+ .core_note_type = NT_X86_XSTATE ,
1256+ .size = sizeof (u64 ),
1257+ .align = sizeof (u64 ),
1258+ .active = xstateregs_active ,
1259+ .regset_get = xstateregs_get ,
1260+ .set = xstateregs_set
12351261 },
1236- [REGSET_IOPERM64 ] = {
1237- .core_note_type = NT_386_IOPERM ,
1238- .n = IO_BITMAP_LONGS ,
1239- .size = sizeof (long ), .align = sizeof (long ),
1240- .active = ioperm_active , .regset_get = ioperm_get
1262+ [REGSET64_IOPERM ] = {
1263+ .core_note_type = NT_386_IOPERM ,
1264+ .n = IO_BITMAP_LONGS ,
1265+ .size = sizeof (long ),
1266+ .align = sizeof (long ),
1267+ .active = ioperm_active ,
1268+ .regset_get = ioperm_get
12411269 },
12421270};
12431271
@@ -1256,43 +1284,57 @@ static const struct user_regset_view user_x86_64_view = {
12561284
12571285#if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION
12581286static struct user_regset x86_32_regsets [] __ro_after_init = {
1259- [REGSET_GENERAL ] = {
1260- .core_note_type = NT_PRSTATUS ,
1261- .n = sizeof (struct user_regs_struct32 ) / sizeof (u32 ),
1262- .size = sizeof (u32 ), .align = sizeof (u32 ),
1263- .regset_get = genregs32_get , .set = genregs32_set
1287+ [REGSET32_GENERAL ] = {
1288+ .core_note_type = NT_PRSTATUS ,
1289+ .n = sizeof (struct user_regs_struct32 ) / sizeof (u32 ),
1290+ .size = sizeof (u32 ),
1291+ .align = sizeof (u32 ),
1292+ .regset_get = genregs32_get ,
1293+ .set = genregs32_set
12641294 },
1265- [REGSET_FP ] = {
1266- .core_note_type = NT_PRFPREG ,
1267- .n = sizeof (struct user_i387_ia32_struct ) / sizeof (u32 ),
1268- .size = sizeof (u32 ), .align = sizeof (u32 ),
1269- .active = regset_fpregs_active , .regset_get = fpregs_get , .set = fpregs_set
1295+ [REGSET32_FP ] = {
1296+ .core_note_type = NT_PRFPREG ,
1297+ .n = sizeof (struct user_i387_ia32_struct ) / sizeof (u32 ),
1298+ .size = sizeof (u32 ),
1299+ .align = sizeof (u32 ),
1300+ .active = regset_fpregs_active ,
1301+ .regset_get = fpregs_get ,
1302+ .set = fpregs_set
12701303 },
1271- [REGSET_XFP ] = {
1272- .core_note_type = NT_PRXFPREG ,
1273- .n = sizeof (struct fxregs_state ) / sizeof (u32 ),
1274- .size = sizeof (u32 ), .align = sizeof (u32 ),
1275- .active = regset_xregset_fpregs_active , .regset_get = xfpregs_get , .set = xfpregs_set
1304+ [REGSET32_XFP ] = {
1305+ .core_note_type = NT_PRXFPREG ,
1306+ .n = sizeof (struct fxregs_state ) / sizeof (u32 ),
1307+ .size = sizeof (u32 ),
1308+ .align = sizeof (u32 ),
1309+ .active = regset_xregset_fpregs_active ,
1310+ .regset_get = xfpregs_get ,
1311+ .set = xfpregs_set
12761312 },
1277- [REGSET_XSTATE ] = {
1278- .core_note_type = NT_X86_XSTATE ,
1279- .size = sizeof (u64 ), .align = sizeof (u64 ),
1280- .active = xstateregs_active , .regset_get = xstateregs_get ,
1281- .set = xstateregs_set
1313+ [REGSET32_XSTATE ] = {
1314+ .core_note_type = NT_X86_XSTATE ,
1315+ .size = sizeof (u64 ),
1316+ .align = sizeof (u64 ),
1317+ .active = xstateregs_active ,
1318+ .regset_get = xstateregs_get ,
1319+ .set = xstateregs_set
12821320 },
1283- [REGSET_TLS ] = {
1284- .core_note_type = NT_386_TLS ,
1285- .n = GDT_ENTRY_TLS_ENTRIES , .bias = GDT_ENTRY_TLS_MIN ,
1286- .size = sizeof (struct user_desc ),
1287- .align = sizeof (struct user_desc ),
1288- .active = regset_tls_active ,
1289- .regset_get = regset_tls_get , .set = regset_tls_set
1321+ [REGSET32_TLS ] = {
1322+ .core_note_type = NT_386_TLS ,
1323+ .n = GDT_ENTRY_TLS_ENTRIES ,
1324+ .bias = GDT_ENTRY_TLS_MIN ,
1325+ .size = sizeof (struct user_desc ),
1326+ .align = sizeof (struct user_desc ),
1327+ .active = regset_tls_active ,
1328+ .regset_get = regset_tls_get ,
1329+ .set = regset_tls_set
12901330 },
1291- [REGSET_IOPERM32 ] = {
1292- .core_note_type = NT_386_IOPERM ,
1293- .n = IO_BITMAP_BYTES / sizeof (u32 ),
1294- .size = sizeof (u32 ), .align = sizeof (u32 ),
1295- .active = ioperm_active , .regset_get = ioperm_get
1331+ [REGSET32_IOPERM ] = {
1332+ .core_note_type = NT_386_IOPERM ,
1333+ .n = IO_BITMAP_BYTES / sizeof (u32 ),
1334+ .size = sizeof (u32 ),
1335+ .align = sizeof (u32 ),
1336+ .active = ioperm_active ,
1337+ .regset_get = ioperm_get
12961338 },
12971339};
12981340
@@ -1311,10 +1353,10 @@ u64 xstate_fx_sw_bytes[USER_XSTATE_FX_SW_WORDS];
13111353void __init update_regset_xstate_info (unsigned int size , u64 xstate_mask )
13121354{
13131355#ifdef CONFIG_X86_64
1314- x86_64_regsets [REGSET_XSTATE ].n = size / sizeof (u64 );
1356+ x86_64_regsets [REGSET64_XSTATE ].n = size / sizeof (u64 );
13151357#endif
13161358#if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION
1317- x86_32_regsets [REGSET_XSTATE ].n = size / sizeof (u64 );
1359+ x86_32_regsets [REGSET32_XSTATE ].n = size / sizeof (u64 );
13181360#endif
13191361 xstate_fx_sw_bytes [USER_XSTATE_XCR0_WORD ] = xstate_mask ;
13201362}
0 commit comments