@@ -92,143 +92,156 @@ int libxl_cpuid_parse_config(libxl_cpuid_policy_list *cpuid, const char* str)
static const struct cpuid_flags cpuid_flags[] = {
{"maxleaf", 0x00000000, NA, CPUID_REG_EAX, 0, 32},
/* the following two entries are subject to tweaking later in the code */
- {"family", 0x00000001, NA, CPUID_REG_EAX, 8, 8},
- {"model", 0x00000001, NA, CPUID_REG_EAX, 4, 8},
{"stepping", 0x00000001, NA, CPUID_REG_EAX, 0, 4},
- {"localapicid", 0x00000001, NA, CPUID_REG_EBX, 24, 8},
- {"proccount", 0x00000001, NA, CPUID_REG_EBX, 16, 8},
- {"clflush", 0x00000001, NA, CPUID_REG_EBX, 8, 8},
+ {"model", 0x00000001, NA, CPUID_REG_EAX, 4, 8},
+ {"family", 0x00000001, NA, CPUID_REG_EAX, 8, 8},
+
{"brandid", 0x00000001, NA, CPUID_REG_EBX, 0, 8},
- {"hypervisor", 0x00000001, NA, CPUID_REG_ECX, 31, 1},
- {"rdrand", 0x00000001, NA, CPUID_REG_ECX, 30, 1},
- {"f16c", 0x00000001, NA, CPUID_REG_ECX, 29, 1},
- {"avx", 0x00000001, NA, CPUID_REG_ECX, 28, 1},
- {"osxsave", 0x00000001, NA, CPUID_REG_ECX, 27, 1},
- {"xsave", 0x00000001, NA, CPUID_REG_ECX, 26, 1},
- {"aes", 0x00000001, NA, CPUID_REG_ECX, 25, 1},
- {"tsc-deadline", 0x00000001, NA, CPUID_REG_ECX, 24, 1},
- {"popcnt", 0x00000001, NA, CPUID_REG_ECX, 23, 1},
- {"movbe", 0x00000001, NA, CPUID_REG_ECX, 22, 1},
- {"x2apic", 0x00000001, NA, CPUID_REG_ECX, 21, 1},
+ {"clflush", 0x00000001, NA, CPUID_REG_EBX, 8, 8},
+ {"proccount", 0x00000001, NA, CPUID_REG_EBX, 16, 8},
+ {"localapicid", 0x00000001, NA, CPUID_REG_EBX, 24, 8},
+
+ {"sse3", 0x00000001, NA, CPUID_REG_ECX, 0, 1},
+ {"pclmulqdq", 0x00000001, NA, CPUID_REG_ECX, 1, 1},
+ {"dtes64", 0x00000001, NA, CPUID_REG_ECX, 2, 1},
+ {"monitor", 0x00000001, NA, CPUID_REG_ECX, 3, 1},
+ {"dscpl", 0x00000001, NA, CPUID_REG_ECX, 4, 1},
+ {"vmx", 0x00000001, NA, CPUID_REG_ECX, 5, 1},
+ {"smx", 0x00000001, NA, CPUID_REG_ECX, 6, 1},
+ {"est", 0x00000001, NA, CPUID_REG_ECX, 7, 1},
+ {"tm2", 0x00000001, NA, CPUID_REG_ECX, 8, 1},
+ {"ssse3", 0x00000001, NA, CPUID_REG_ECX, 9, 1},
+ {"cntxid", 0x00000001, NA, CPUID_REG_ECX, 10, 1},
+ {"fma", 0x00000001, NA, CPUID_REG_ECX, 12, 1},
+ {"cmpxchg16", 0x00000001, NA, CPUID_REG_ECX, 13, 1},
+ {"xtpr", 0x00000001, NA, CPUID_REG_ECX, 14, 1},
+ {"pdcm", 0x00000001, NA, CPUID_REG_ECX, 15, 1},
+ {"pcid", 0x00000001, NA, CPUID_REG_ECX, 17, 1},
+ {"dca", 0x00000001, NA, CPUID_REG_ECX, 18, 1},
/* Linux uses sse4_{1,2}. Keep sse4.{1,2} for compatibility */
- {"sse4.2", 0x00000001, NA, CPUID_REG_ECX, 20, 1},
- {"sse4_2", 0x00000001, NA, CPUID_REG_ECX, 20, 1},
- {"sse4.1", 0x00000001, NA, CPUID_REG_ECX, 19, 1},
{"sse4_1", 0x00000001, NA, CPUID_REG_ECX, 19, 1},
- {"dca", 0x00000001, NA, CPUID_REG_ECX, 18, 1},
- {"pcid", 0x00000001, NA, CPUID_REG_ECX, 17, 1},
- {"pdcm", 0x00000001, NA, CPUID_REG_ECX, 15, 1},
- {"xtpr", 0x00000001, NA, CPUID_REG_ECX, 14, 1},
- {"cmpxchg16", 0x00000001, NA, CPUID_REG_ECX, 13, 1},
- {"fma", 0x00000001, NA, CPUID_REG_ECX, 12, 1},
- {"cntxid", 0x00000001, NA, CPUID_REG_ECX, 10, 1},
- {"ssse3", 0x00000001, NA, CPUID_REG_ECX, 9, 1},
- {"tm2", 0x00000001, NA, CPUID_REG_ECX, 8, 1},
- {"est", 0x00000001, NA, CPUID_REG_ECX, 7, 1},
- {"smx", 0x00000001, NA, CPUID_REG_ECX, 6, 1},
- {"vmx", 0x00000001, NA, CPUID_REG_ECX, 5, 1},
- {"dscpl", 0x00000001, NA, CPUID_REG_ECX, 4, 1},
- {"monitor", 0x00000001, NA, CPUID_REG_ECX, 3, 1},
- {"dtes64", 0x00000001, NA, CPUID_REG_ECX, 2, 1},
- {"pclmulqdq", 0x00000001, NA, CPUID_REG_ECX, 1, 1},
- {"sse3", 0x00000001, NA, CPUID_REG_ECX, 0, 1},
- {"pbe", 0x00000001, NA, CPUID_REG_EDX, 31, 1},
- {"ia64", 0x00000001, NA, CPUID_REG_EDX, 30, 1},
- {"tm", 0x00000001, NA, CPUID_REG_EDX, 29, 1},
- {"htt", 0x00000001, NA, CPUID_REG_EDX, 28, 1},
- {"ss", 0x00000001, NA, CPUID_REG_EDX, 27, 1},
- {"sse2", 0x00000001, NA, CPUID_REG_EDX, 26, 1},
- {"sse", 0x00000001, NA, CPUID_REG_EDX, 25, 1},
- {"fxsr", 0x00000001, NA, CPUID_REG_EDX, 24, 1},
- {"mmx", 0x00000001, NA, CPUID_REG_EDX, 23, 1},
- {"acpi", 0x00000001, NA, CPUID_REG_EDX, 22, 1},
- {"ds", 0x00000001, NA, CPUID_REG_EDX, 21, 1},
- {"clfsh", 0x00000001, NA, CPUID_REG_EDX, 19, 1},
- {"psn", 0x00000001, NA, CPUID_REG_EDX, 18, 1},
- {"pse36", 0x00000001, NA, CPUID_REG_EDX, 17, 1},
- {"pat", 0x00000001, NA, CPUID_REG_EDX, 16, 1},
- {"cmov", 0x00000001, NA, CPUID_REG_EDX, 15, 1},
- {"mca", 0x00000001, NA, CPUID_REG_EDX, 14, 1},
- {"pge", 0x00000001, NA, CPUID_REG_EDX, 13, 1},
- {"mtrr", 0x00000001, NA, CPUID_REG_EDX, 12, 1},
- {"sysenter", 0x00000001, NA, CPUID_REG_EDX, 11, 1},
- {"apic", 0x00000001, NA, CPUID_REG_EDX, 9, 1},
- {"cmpxchg8", 0x00000001, NA, CPUID_REG_EDX, 8, 1},
- {"mce", 0x00000001, NA, CPUID_REG_EDX, 7, 1},
- {"pae", 0x00000001, NA, CPUID_REG_EDX, 6, 1},
- {"msr", 0x00000001, NA, CPUID_REG_EDX, 5, 1},
- {"tsc", 0x00000001, NA, CPUID_REG_EDX, 4, 1},
- {"pse", 0x00000001, NA, CPUID_REG_EDX, 3, 1},
- {"de", 0x00000001, NA, CPUID_REG_EDX, 2, 1},
- {"vme", 0x00000001, NA, CPUID_REG_EDX, 1, 1},
+ {"sse4.1", 0x00000001, NA, CPUID_REG_ECX, 19, 1},
+ {"sse4_2", 0x00000001, NA, CPUID_REG_ECX, 20, 1},
+ {"sse4.2", 0x00000001, NA, CPUID_REG_ECX, 20, 1},
+ {"x2apic", 0x00000001, NA, CPUID_REG_ECX, 21, 1},
+ {"movbe", 0x00000001, NA, CPUID_REG_ECX, 22, 1},
+ {"popcnt", 0x00000001, NA, CPUID_REG_ECX, 23, 1},
+ {"tsc-deadline", 0x00000001, NA, CPUID_REG_ECX, 24, 1},
+ {"aes", 0x00000001, NA, CPUID_REG_ECX, 25, 1},
+ {"xsave", 0x00000001, NA, CPUID_REG_ECX, 26, 1},
+ {"osxsave", 0x00000001, NA, CPUID_REG_ECX, 27, 1},
+ {"avx", 0x00000001, NA, CPUID_REG_ECX, 28, 1},
+ {"f16c", 0x00000001, NA, CPUID_REG_ECX, 29, 1},
+ {"rdrand", 0x00000001, NA, CPUID_REG_ECX, 30, 1},
+ {"hypervisor", 0x00000001, NA, CPUID_REG_ECX, 31, 1},
+
{"fpu", 0x00000001, NA, CPUID_REG_EDX, 0, 1},
+ {"vme", 0x00000001, NA, CPUID_REG_EDX, 1, 1},
+ {"de", 0x00000001, NA, CPUID_REG_EDX, 2, 1},
+ {"pse", 0x00000001, NA, CPUID_REG_EDX, 3, 1},
+ {"tsc", 0x00000001, NA, CPUID_REG_EDX, 4, 1},
+ {"msr", 0x00000001, NA, CPUID_REG_EDX, 5, 1},
+ {"pae", 0x00000001, NA, CPUID_REG_EDX, 6, 1},
+ {"mce", 0x00000001, NA, CPUID_REG_EDX, 7, 1},
+ {"cmpxchg8", 0x00000001, NA, CPUID_REG_EDX, 8, 1},
+ {"apic", 0x00000001, NA, CPUID_REG_EDX, 9, 1},
+ {"sysenter", 0x00000001, NA, CPUID_REG_EDX, 11, 1},
+ {"mtrr", 0x00000001, NA, CPUID_REG_EDX, 12, 1},
+ {"pge", 0x00000001, NA, CPUID_REG_EDX, 13, 1},
+ {"mca", 0x00000001, NA, CPUID_REG_EDX, 14, 1},
+ {"cmov", 0x00000001, NA, CPUID_REG_EDX, 15, 1},
+ {"pat", 0x00000001, NA, CPUID_REG_EDX, 16, 1},
+ {"pse36", 0x00000001, NA, CPUID_REG_EDX, 17, 1},
+ {"psn", 0x00000001, NA, CPUID_REG_EDX, 18, 1},
+ {"clfsh", 0x00000001, NA, CPUID_REG_EDX, 19, 1},
+ {"ds", 0x00000001, NA, CPUID_REG_EDX, 21, 1},
+ {"acpi", 0x00000001, NA, CPUID_REG_EDX, 22, 1},
+ {"mmx", 0x00000001, NA, CPUID_REG_EDX, 23, 1},
+ {"fxsr", 0x00000001, NA, CPUID_REG_EDX, 24, 1},
+ {"sse", 0x00000001, NA, CPUID_REG_EDX, 25, 1},
+ {"sse2", 0x00000001, NA, CPUID_REG_EDX, 26, 1},
+ {"ss", 0x00000001, NA, CPUID_REG_EDX, 27, 1},
+ {"htt", 0x00000001, NA, CPUID_REG_EDX, 28, 1},
+ {"tm", 0x00000001, NA, CPUID_REG_EDX, 29, 1},
+ {"ia64", 0x00000001, NA, CPUID_REG_EDX, 30, 1},
+ {"pbe", 0x00000001, NA, CPUID_REG_EDX, 31, 1},
+
{"arat", 0x00000006, NA, CPUID_REG_EAX, 2, 1},
- {"avx512vl", 0x00000007, 0, CPUID_REG_EBX, 31, 1},
- {"avx512bw", 0x00000007, 0, CPUID_REG_EBX, 30, 1},
- {"sha", 0x00000007, 0, CPUID_REG_EBX, 29, 1},
- {"avx512cd", 0x00000007, 0, CPUID_REG_EBX, 28, 1},
- {"avx512er", 0x00000007, 0, CPUID_REG_EBX, 27, 1},
- {"avx512pf", 0x00000007, 0, CPUID_REG_EBX, 26, 1},
- {"clwb", 0x00000007, 0, CPUID_REG_EBX, 24, 1},
- {"clflushopt", 0x00000007, 0, CPUID_REG_EBX, 23, 1},
- {"avx512ifma", 0x00000007, 0, CPUID_REG_EBX, 21, 1},
- {"smap", 0x00000007, 0, CPUID_REG_EBX, 20, 1},
- {"adx", 0x00000007, 0, CPUID_REG_EBX, 19, 1},
- {"rdseed", 0x00000007, 0, CPUID_REG_EBX, 18, 1},
- {"avx512dq", 0x00000007, 0, CPUID_REG_EBX, 17, 1},
- {"avx512f", 0x00000007, 0, CPUID_REG_EBX, 16, 1},
- {"mpx", 0x00000007, 0, CPUID_REG_EBX, 14, 1},
- {"cmt", 0x00000007, 0, CPUID_REG_EBX, 12, 1},
- {"rtm", 0x00000007, 0, CPUID_REG_EBX, 11, 1},
- {"invpcid", 0x00000007, 0, CPUID_REG_EBX, 10, 1},
- {"erms", 0x00000007, 0, CPUID_REG_EBX, 9, 1},
- {"bmi2", 0x00000007, 0, CPUID_REG_EBX, 8, 1},
- {"smep", 0x00000007, 0, CPUID_REG_EBX, 7, 1},
- {"avx2", 0x00000007, 0, CPUID_REG_EBX, 5, 1},
- {"hle", 0x00000007, 0, CPUID_REG_EBX, 4, 1},
- {"bmi1", 0x00000007, 0, CPUID_REG_EBX, 3, 1},
- {"tsc_adjust", 0x00000007, 0, CPUID_REG_EBX, 1, 1},
+
{"fsgsbase", 0x00000007, 0, CPUID_REG_EBX, 0, 1},
- {"ospke", 0x00000007, 0, CPUID_REG_ECX, 4, 1},
- {"pku", 0x00000007, 0, CPUID_REG_ECX, 3, 1},
- {"umip", 0x00000007, 0, CPUID_REG_ECX, 2, 1},
+ {"tsc_adjust", 0x00000007, 0, CPUID_REG_EBX, 1, 1},
+ {"bmi1", 0x00000007, 0, CPUID_REG_EBX, 3, 1},
+ {"hle", 0x00000007, 0, CPUID_REG_EBX, 4, 1},
+ {"avx2", 0x00000007, 0, CPUID_REG_EBX, 5, 1},
+ {"smep", 0x00000007, 0, CPUID_REG_EBX, 7, 1},
+ {"bmi2", 0x00000007, 0, CPUID_REG_EBX, 8, 1},
+ {"erms", 0x00000007, 0, CPUID_REG_EBX, 9, 1},
+ {"invpcid", 0x00000007, 0, CPUID_REG_EBX, 10, 1},
+ {"rtm", 0x00000007, 0, CPUID_REG_EBX, 11, 1},
+ {"cmt", 0x00000007, 0, CPUID_REG_EBX, 12, 1},
+ {"mpx", 0x00000007, 0, CPUID_REG_EBX, 14, 1},
+ {"avx512f", 0x00000007, 0, CPUID_REG_EBX, 16, 1},
+ {"avx512dq", 0x00000007, 0, CPUID_REG_EBX, 17, 1},
+ {"rdseed", 0x00000007, 0, CPUID_REG_EBX, 18, 1},
+ {"adx", 0x00000007, 0, CPUID_REG_EBX, 19, 1},
+ {"smap", 0x00000007, 0, CPUID_REG_EBX, 20, 1},
+ {"avx512ifma", 0x00000007, 0, CPUID_REG_EBX, 21, 1},
+ {"clflushopt", 0x00000007, 0, CPUID_REG_EBX, 23, 1},
+ {"clwb", 0x00000007, 0, CPUID_REG_EBX, 24, 1},
+ {"avx512pf", 0x00000007, 0, CPUID_REG_EBX, 26, 1},
+ {"avx512er", 0x00000007, 0, CPUID_REG_EBX, 27, 1},
+ {"avx512cd", 0x00000007, 0, CPUID_REG_EBX, 28, 1},
+ {"sha", 0x00000007, 0, CPUID_REG_EBX, 29, 1},
+ {"avx512bw", 0x00000007, 0, CPUID_REG_EBX, 30, 1},
+ {"avx512vl", 0x00000007, 0, CPUID_REG_EBX, 31, 1},
+
{"avx512vbmi", 0x00000007, 0, CPUID_REG_ECX, 1, 1},
- {"avx512-4fmaps",0x00000007, 0, CPUID_REG_EDX, 3, 1},
+ {"umip", 0x00000007, 0, CPUID_REG_ECX, 2, 1},
+ {"pku", 0x00000007, 0, CPUID_REG_ECX, 3, 1},
+ {"ospke", 0x00000007, 0, CPUID_REG_ECX, 4, 1},
+
{"avx512-4vnniw",0x00000007, 0, CPUID_REG_EDX, 2, 1},
- {"perfctr_nb", 0x80000001, NA, CPUID_REG_ECX, 24, 1},
- {"perfctr_core", 0x80000001, NA, CPUID_REG_ECX, 23, 1},
- {"topoext", 0x80000001, NA, CPUID_REG_ECX, 22, 1},
- {"tbm", 0x80000001, NA, CPUID_REG_ECX, 21, 1},
- {"nodeid", 0x80000001, NA, CPUID_REG_ECX, 19, 1},
- {"fma4", 0x80000001, NA, CPUID_REG_ECX, 16, 1},
- {"lwp", 0x80000001, NA, CPUID_REG_ECX, 15, 1},
- {"wdt", 0x80000001, NA, CPUID_REG_ECX, 13, 1},
- {"skinit", 0x80000001, NA, CPUID_REG_ECX, 12, 1},
- {"xop", 0x80000001, NA, CPUID_REG_ECX, 11, 1},
- {"ibs", 0x80000001, NA, CPUID_REG_ECX, 10, 1},
- {"osvw", 0x80000001, NA, CPUID_REG_ECX, 9, 1},
- {"3dnowprefetch",0x80000001, NA, CPUID_REG_ECX, 8, 1},
- {"misalignsse", 0x80000001, NA, CPUID_REG_ECX, 7, 1},
- {"sse4a", 0x80000001, NA, CPUID_REG_ECX, 6, 1},
- {"abm", 0x80000001, NA, CPUID_REG_ECX, 5, 1},
- {"altmovcr8", 0x80000001, NA, CPUID_REG_ECX, 4, 1},
- {"extapic", 0x80000001, NA, CPUID_REG_ECX, 3, 1},
- {"svm", 0x80000001, NA, CPUID_REG_ECX, 2, 1},
- {"cmplegacy", 0x80000001, NA, CPUID_REG_ECX, 1, 1},
+ {"avx512-4fmaps",0x00000007, 0, CPUID_REG_EDX, 3, 1},
+
{"lahfsahf", 0x80000001, NA, CPUID_REG_ECX, 0, 1},
- {"3dnow", 0x80000001, NA, CPUID_REG_EDX, 31, 1},
- {"3dnowext", 0x80000001, NA, CPUID_REG_EDX, 30, 1},
- {"lm", 0x80000001, NA, CPUID_REG_EDX, 29, 1},
- {"rdtscp", 0x80000001, NA, CPUID_REG_EDX, 27, 1},
- {"page1gb", 0x80000001, NA, CPUID_REG_EDX, 26, 1},
- {"ffxsr", 0x80000001, NA, CPUID_REG_EDX, 25, 1},
- {"mmxext", 0x80000001, NA, CPUID_REG_EDX, 22, 1},
- {"nx", 0x80000001, NA, CPUID_REG_EDX, 20, 1},
+ {"cmplegacy", 0x80000001, NA, CPUID_REG_ECX, 1, 1},
+ {"svm", 0x80000001, NA, CPUID_REG_ECX, 2, 1},
+ {"extapic", 0x80000001, NA, CPUID_REG_ECX, 3, 1},
+ {"altmovcr8", 0x80000001, NA, CPUID_REG_ECX, 4, 1},
+ {"abm", 0x80000001, NA, CPUID_REG_ECX, 5, 1},
+ {"sse4a", 0x80000001, NA, CPUID_REG_ECX, 6, 1},
+ {"misalignsse", 0x80000001, NA, CPUID_REG_ECX, 7, 1},
+ {"3dnowprefetch",0x80000001, NA, CPUID_REG_ECX, 8, 1},
+ {"osvw", 0x80000001, NA, CPUID_REG_ECX, 9, 1},
+ {"ibs", 0x80000001, NA, CPUID_REG_ECX, 10, 1},
+ {"xop", 0x80000001, NA, CPUID_REG_ECX, 11, 1},
+ {"skinit", 0x80000001, NA, CPUID_REG_ECX, 12, 1},
+ {"wdt", 0x80000001, NA, CPUID_REG_ECX, 13, 1},
+ {"lwp", 0x80000001, NA, CPUID_REG_ECX, 15, 1},
+ {"fma4", 0x80000001, NA, CPUID_REG_ECX, 16, 1},
+ {"nodeid", 0x80000001, NA, CPUID_REG_ECX, 19, 1},
+ {"tbm", 0x80000001, NA, CPUID_REG_ECX, 21, 1},
+ {"topoext", 0x80000001, NA, CPUID_REG_ECX, 22, 1},
+ {"perfctr_core", 0x80000001, NA, CPUID_REG_ECX, 23, 1},
+ {"perfctr_nb", 0x80000001, NA, CPUID_REG_ECX, 24, 1},
+
{"syscall", 0x80000001, NA, CPUID_REG_EDX, 11, 1},
+ {"nx", 0x80000001, NA, CPUID_REG_EDX, 20, 1},
+ {"mmxext", 0x80000001, NA, CPUID_REG_EDX, 22, 1},
+ {"ffxsr", 0x80000001, NA, CPUID_REG_EDX, 25, 1},
+ {"page1gb", 0x80000001, NA, CPUID_REG_EDX, 26, 1},
+ {"rdtscp", 0x80000001, NA, CPUID_REG_EDX, 27, 1},
+ {"lm", 0x80000001, NA, CPUID_REG_EDX, 29, 1},
+ {"3dnowext", 0x80000001, NA, CPUID_REG_EDX, 30, 1},
+ {"3dnow", 0x80000001, NA, CPUID_REG_EDX, 31, 1},
+
{"procpkg", 0x00000004, 0, CPUID_REG_EAX, 26, 6},
+
{"invtsc", 0x80000007, NA, CPUID_REG_EDX, 8, 1},
- {"apicidsize", 0x80000008, NA, CPUID_REG_ECX, 12, 4},
+
{"nc", 0x80000008, NA, CPUID_REG_ECX, 0, 8},
+ {"apicidsize", 0x80000008, NA, CPUID_REG_ECX, 12, 4},
+
{"svm_npt", 0x8000000a, NA, CPUID_REG_EDX, 0, 1},
{"svm_lbrv", 0x8000000a, NA, CPUID_REG_EDX, 1, 1},
{"svm_nrips", 0x8000000a, NA, CPUID_REG_EDX, 3, 1},
@@ -236,6 +249,7 @@ int libxl_cpuid_parse_config(libxl_cpuid_policy_list *cpuid, const char* str)
{"svm_vmcbclean",0x8000000a, NA, CPUID_REG_EDX, 5, 1},
{"svm_decode", 0x8000000a, NA, CPUID_REG_EDX, 7, 1},
{"svm_pausefilt",0x8000000a, NA, CPUID_REG_EDX, 10, 1},
+
{"maxhvleaf", 0x40000000, NA, CPUID_REG_EAX, 0, 8},
{NULL, 0, NA, CPUID_REG_INV, 0, 0}
Reverse sorting order, add blank lines at register change. Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> --- tools/libxl/libxl_cpuid.c | 260 ++++++++++++++++++++------------------- 1 file changed, 137 insertions(+), 123 deletions(-)