Blame view

kernel/linux-rt-4.4.41/arch/x86/mm/kmemcheck/selftest.c 1.57 KB
5113f6f70   김현기   kernel add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
  #include <linux/bug.h>
  #include <linux/kernel.h>
  
  #include "opcode.h"
  #include "selftest.h"
  
  struct selftest_opcode {
  	unsigned int expected_size;
  	const uint8_t *insn;
  	const char *desc;
  };
  
  static const struct selftest_opcode selftest_opcodes[] = {
  	/* REP MOVS */
  	{1, "\xf3\xa4", 		"rep movsb <mem8>, <mem8>"},
  	{4, "\xf3\xa5",			"rep movsl <mem32>, <mem32>"},
  
  	/* MOVZX / MOVZXD */
  	{1, "\x66\x0f\xb6\x51\xf8",	"movzwq <mem8>, <reg16>"},
  	{1, "\x0f\xb6\x51\xf8",		"movzwq <mem8>, <reg32>"},
  
  	/* MOVSX / MOVSXD */
  	{1, "\x66\x0f\xbe\x51\xf8",	"movswq <mem8>, <reg16>"},
  	{1, "\x0f\xbe\x51\xf8",		"movswq <mem8>, <reg32>"},
  
  #ifdef CONFIG_X86_64
  	/* MOVZX / MOVZXD */
  	{1, "\x49\x0f\xb6\x51\xf8",	"movzbq <mem8>, <reg64>"},
  	{2, "\x49\x0f\xb7\x51\xf8",	"movzbq <mem16>, <reg64>"},
  
  	/* MOVSX / MOVSXD */
  	{1, "\x49\x0f\xbe\x51\xf8",	"movsbq <mem8>, <reg64>"},
  	{2, "\x49\x0f\xbf\x51\xf8",	"movsbq <mem16>, <reg64>"},
  	{4, "\x49\x63\x51\xf8",		"movslq <mem32>, <reg64>"},
  #endif
  };
  
  static bool selftest_opcode_one(const struct selftest_opcode *op)
  {
  	unsigned size;
  
  	kmemcheck_opcode_decode(op->insn, &size);
  
  	if (size == op->expected_size)
  		return true;
  
  	printk(KERN_WARNING "kmemcheck: opcode %s: expected size %d, got %d
  ",
  		op->desc, op->expected_size, size);
  	return false;
  }
  
  static bool selftest_opcodes_all(void)
  {
  	bool pass = true;
  	unsigned int i;
  
  	for (i = 0; i < ARRAY_SIZE(selftest_opcodes); ++i)
  		pass = pass && selftest_opcode_one(&selftest_opcodes[i]);
  
  	return pass;
  }
  
  bool kmemcheck_selftest(void)
  {
  	bool pass = true;
  
  	pass = pass && selftest_opcodes_all();
  
  	return pass;
  }