diff options
Diffstat (limited to 'arch/x86/kernel/ptrace.c')
| -rw-r--r-- | arch/x86/kernel/ptrace.c | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c index d03146f71b2f..2d96aab82a48 100644 --- a/arch/x86/kernel/ptrace.c +++ b/arch/x86/kernel/ptrace.c | |||
| @@ -48,6 +48,7 @@ enum x86_regset { | |||
| 48 | REGSET_FP, | 48 | REGSET_FP, |
| 49 | REGSET_XFP, | 49 | REGSET_XFP, |
| 50 | REGSET_IOPERM64 = REGSET_XFP, | 50 | REGSET_IOPERM64 = REGSET_XFP, |
| 51 | REGSET_XSTATE, | ||
| 51 | REGSET_TLS, | 52 | REGSET_TLS, |
| 52 | REGSET_IOPERM32, | 53 | REGSET_IOPERM32, |
| 53 | }; | 54 | }; |
| @@ -1563,7 +1564,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | |||
| 1563 | 1564 | ||
| 1564 | #ifdef CONFIG_X86_64 | 1565 | #ifdef CONFIG_X86_64 |
| 1565 | 1566 | ||
| 1566 | static const struct user_regset x86_64_regsets[] = { | 1567 | static struct user_regset x86_64_regsets[] __read_mostly = { |
| 1567 | [REGSET_GENERAL] = { | 1568 | [REGSET_GENERAL] = { |
| 1568 | .core_note_type = NT_PRSTATUS, | 1569 | .core_note_type = NT_PRSTATUS, |
| 1569 | .n = sizeof(struct user_regs_struct) / sizeof(long), | 1570 | .n = sizeof(struct user_regs_struct) / sizeof(long), |
| @@ -1576,6 +1577,12 @@ static const struct user_regset x86_64_regsets[] = { | |||
| 1576 | .size = sizeof(long), .align = sizeof(long), | 1577 | .size = sizeof(long), .align = sizeof(long), |
| 1577 | .active = xfpregs_active, .get = xfpregs_get, .set = xfpregs_set | 1578 | .active = xfpregs_active, .get = xfpregs_get, .set = xfpregs_set |
| 1578 | }, | 1579 | }, |
| 1580 | [REGSET_XSTATE] = { | ||
| 1581 | .core_note_type = NT_X86_XSTATE, | ||
| 1582 | .size = sizeof(u64), .align = sizeof(u64), | ||
| 1583 | .active = xstateregs_active, .get = xstateregs_get, | ||
| 1584 | .set = xstateregs_set | ||
| 1585 | }, | ||
| 1579 | [REGSET_IOPERM64] = { | 1586 | [REGSET_IOPERM64] = { |
| 1580 | .core_note_type = NT_386_IOPERM, | 1587 | .core_note_type = NT_386_IOPERM, |
| 1581 | .n = IO_BITMAP_LONGS, | 1588 | .n = IO_BITMAP_LONGS, |
| @@ -1601,7 +1608,7 @@ static const struct user_regset_view user_x86_64_view = { | |||
| 1601 | #endif /* CONFIG_X86_64 */ | 1608 | #endif /* CONFIG_X86_64 */ |
| 1602 | 1609 | ||
| 1603 | #if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION | 1610 | #if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION |
| 1604 | static const struct user_regset x86_32_regsets[] = { | 1611 | static struct user_regset x86_32_regsets[] __read_mostly = { |
| 1605 | [REGSET_GENERAL] = { | 1612 | [REGSET_GENERAL] = { |
| 1606 | .core_note_type = NT_PRSTATUS, | 1613 | .core_note_type = NT_PRSTATUS, |
| 1607 | .n = sizeof(struct user_regs_struct32) / sizeof(u32), | 1614 | .n = sizeof(struct user_regs_struct32) / sizeof(u32), |
| @@ -1620,6 +1627,12 @@ static const struct user_regset x86_32_regsets[] = { | |||
| 1620 | .size = sizeof(u32), .align = sizeof(u32), | 1627 | .size = sizeof(u32), .align = sizeof(u32), |
| 1621 | .active = xfpregs_active, .get = xfpregs_get, .set = xfpregs_set | 1628 | .active = xfpregs_active, .get = xfpregs_get, .set = xfpregs_set |
| 1622 | }, | 1629 | }, |
| 1630 | [REGSET_XSTATE] = { | ||
| 1631 | .core_note_type = NT_X86_XSTATE, | ||
| 1632 | .size = sizeof(u64), .align = sizeof(u64), | ||
| 1633 | .active = xstateregs_active, .get = xstateregs_get, | ||
| 1634 | .set = xstateregs_set | ||
| 1635 | }, | ||
| 1623 | [REGSET_TLS] = { | 1636 | [REGSET_TLS] = { |
| 1624 | .core_note_type = NT_386_TLS, | 1637 | .core_note_type = NT_386_TLS, |
| 1625 | .n = GDT_ENTRY_TLS_ENTRIES, .bias = GDT_ENTRY_TLS_MIN, | 1638 | .n = GDT_ENTRY_TLS_ENTRIES, .bias = GDT_ENTRY_TLS_MIN, |
| @@ -1642,6 +1655,23 @@ static const struct user_regset_view user_x86_32_view = { | |||
| 1642 | }; | 1655 | }; |
| 1643 | #endif | 1656 | #endif |
| 1644 | 1657 | ||
| 1658 | /* | ||
| 1659 | * This represents bytes 464..511 in the memory layout exported through | ||
| 1660 | * the REGSET_XSTATE interface. | ||
| 1661 | */ | ||
| 1662 | u64 xstate_fx_sw_bytes[USER_XSTATE_FX_SW_WORDS]; | ||
| 1663 | |||
| 1664 | void update_regset_xstate_info(unsigned int size, u64 xstate_mask) | ||
| 1665 | { | ||
| 1666 | #ifdef CONFIG_X86_64 | ||
| 1667 | x86_64_regsets[REGSET_XSTATE].n = size / sizeof(u64); | ||
| 1668 | #endif | ||
| 1669 | #if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION | ||
| 1670 | x86_32_regsets[REGSET_XSTATE].n = size / sizeof(u64); | ||
| 1671 | #endif | ||
| 1672 | xstate_fx_sw_bytes[USER_XSTATE_XCR0_WORD] = xstate_mask; | ||
| 1673 | } | ||
| 1674 | |||
| 1645 | const struct user_regset_view *task_user_regset_view(struct task_struct *task) | 1675 | const struct user_regset_view *task_user_regset_view(struct task_struct *task) |
| 1646 | { | 1676 | { |
| 1647 | #ifdef CONFIG_IA32_EMULATION | 1677 | #ifdef CONFIG_IA32_EMULATION |
