x86: implement undefined_instruction()

The LKDTM UNDEFINED_INSTRUCTION test can be used to test our handling of
undefined instructions. Implement undefined_instruction() so that we can
use this on x86.

Note: objtool currently warns:

| drivers/misc/lkdtm/bugs.o: warning: objtool: lkdtm_UNDEFINED_INSTRUCTION+0x2: unreachable instruction

For example, on x86_64 this currently results in:

| # echo UNDEFINED_INSTRUCTION > /sys/kernel/debug/provoke-crash/DIRECT
| invalid opcode: 0000 [#1] PREEMPT SMP PTI
| CPU: 0 PID: 116 Comm: sh Not tainted 5.19.0-00431-g36c9e03e3462 #3
| Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-2 04/01/2014
| RIP: 0010:lkdtm_UNDEFINED_INSTRUCTION+0x0/0x10
| Code: 1f 84 00 00 00 00 00 0f 1f 00 fa f3 90 eb fc 66 66 2e 0f 1f 84 00 00 00 00 00 48 c7 c7 88 78 db be e9 04 90 55 00 0f 1f 40 00 <0f> 0b 48 c7 c7 40 fc 21 be e9 ed 41 4f 00 66 90 4c 8b 8
| RSP: 0018:ffffa5a4401e3e68 EFLAGS: 00010286
| RAX: ffffffffbd38f950 RBX: 0000000000000016 RCX: 0000000000000000
| RDX: 0000000000000000 RSI: ffffffffbe193561 RDI: ffffffffbe5d6f60
| RBP: ffff9c82824f6000 R08: ffffffffbe535f08 R09: 0000000000009ffb
| R10: 0000000000000192 R11: ffffffffbe505f20 R12: ffffffffbe5d6f60
| R13: ffffa5a4401e3f08 R14: ffffa5a4401e3f08 R15: ffff9c8281ed3c00
| FS:  00007f3f8741f6a0(0000) GS:ffff9c82bec00000(0000) knlGS:0000000000000000
| CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
| CR2: 000000000045a8c1 CR3: 0000000002520006 CR4: 0000000000370ef0
| DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
| DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
| Call Trace:
|  <TASK>
|  direct_entry.cold+0x18/0x24
|  full_proxy_write+0x4e/0x80
|  vfs_write+0xb4/0x290
|  ksys_write+0x5a/0xe0
|  do_syscall_64+0x3b/0x90
|  entry_SYSCALL_64_after_hwframe+0x63/0xcd
| RIP: 0033:0x7f3f873a5103
| Code: 8b 7c 24 08 89 c5 e8 c5 ff ff ff 89 ef 89 44 24 08 e8 81 bc 02 00 8b 44 24 08 48 83 c4 10 5d c3 48 63 ff b8 01 00 00 00 0f 05 <48> 3d 00 f0 ff ff 76 10 48 8b 15 4e fd 05 00 f7 d8 64 3
| RSP: 002b:00007ffdacb51278 EFLAGS: 00000246 ORIG_RAX: 0000000000000001
| RAX: ffffffffffffffda RBX: 0000000000000001 RCX: 00007f3f873a5103
| RDX: 0000000000000016 RSI: 00000000011bd930 RDI: 0000000000000001
| RBP: 00000000011bd930 R08: fefefefefefefeff R09: fefeff4d4e485342
| R10: 00007f3f874202b0 R11: 0000000000000246 R12: 0000000000000016
| R13: 00007f3f8741f690 R14: 0000000000000001 R15: 00000000011ba450
|  </TASK>
| Modules linked in:
| ---[ end trace 0000000000000000 ]---
| RIP: 0010:lkdtm_UNDEFINED_INSTRUCTION+0x0/0x10
| Code: 1f 84 00 00 00 00 00 0f 1f 00 fa f3 90 eb fc 66 66 2e 0f 1f 84 00 00 00 00 00 48 c7 c7 88 78 db be e9 04 90 55 00 0f 1f 40 00 <0f> 0b 48 c7 c7 40 fc 21 be e9 ed 41 4f 00 66 90 4c 8b 8
| RSP: 0018:ffffa5a4401e3e68 EFLAGS: 00010286
| RAX: ffffffffbd38f950 RBX: 0000000000000016 RCX: 0000000000000000
| RDX: 0000000000000000 RSI: ffffffffbe193561 RDI: ffffffffbe5d6f60
| RBP: ffff9c82824f6000 R08: ffffffffbe535f08 R09: 0000000000009ffb
| R10: 0000000000000192 R11: ffffffffbe505f20 R12: ffffffffbe5d6f60
| R13: ffffa5a4401e3f08 R14: ffffa5a4401e3f08 R15: ffff9c8281ed3c00
| FS:  00007f3f8741f6a0(0000) GS:ffff9c82bec00000(0000) knlGS:0000000000000000
| CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
| CR2: 000000000045a8c1 CR3: 0000000002520006 CR4: 0000000000370ef0
| DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
| DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Josh Poimboeuf <jpoimboe@kernel.org>
Cc: Kees Cook <keescook@chromium.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
1 file changed