Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86/insn: Avoid namespace clash by separating instruction decoder MMIO type from MMIO trace type

Both <linux/mmiotrace.h> and <asm/insn-eval.h> define various MMIO_ enum constants,
whose namespace overlaps.

Rename the <asm/insn-eval.h> ones to have a INSN_ prefix, so that the headers can be
used from the same source file.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://lore.kernel.org/r/20230101162910.710293-2-Jason@zx2c4.com

authored by

Jason A. Donenfeld and committed by
Ingo Molnar
72bb8f8c 55d23536

+41 -41
+13 -13
arch/x86/coco/tdx/tdx.c
··· 386 386 { 387 387 unsigned long *reg, val, vaddr; 388 388 char buffer[MAX_INSN_SIZE]; 389 + enum insn_mmio_type mmio; 389 390 struct insn insn = {}; 390 - enum mmio_type mmio; 391 391 int size, extend_size; 392 392 u8 extend_val = 0; 393 393 ··· 402 402 return -EINVAL; 403 403 404 404 mmio = insn_decode_mmio(&insn, &size); 405 - if (WARN_ON_ONCE(mmio == MMIO_DECODE_FAILED)) 405 + if (WARN_ON_ONCE(mmio == INSN_MMIO_DECODE_FAILED)) 406 406 return -EINVAL; 407 407 408 - if (mmio != MMIO_WRITE_IMM && mmio != MMIO_MOVS) { 408 + if (mmio != INSN_MMIO_WRITE_IMM && mmio != INSN_MMIO_MOVS) { 409 409 reg = insn_get_modrm_reg_ptr(&insn, regs); 410 410 if (!reg) 411 411 return -EINVAL; ··· 426 426 427 427 /* Handle writes first */ 428 428 switch (mmio) { 429 - case MMIO_WRITE: 429 + case INSN_MMIO_WRITE: 430 430 memcpy(&val, reg, size); 431 431 if (!mmio_write(size, ve->gpa, val)) 432 432 return -EIO; 433 433 return insn.length; 434 - case MMIO_WRITE_IMM: 434 + case INSN_MMIO_WRITE_IMM: 435 435 val = insn.immediate.value; 436 436 if (!mmio_write(size, ve->gpa, val)) 437 437 return -EIO; 438 438 return insn.length; 439 - case MMIO_READ: 440 - case MMIO_READ_ZERO_EXTEND: 441 - case MMIO_READ_SIGN_EXTEND: 439 + case INSN_MMIO_READ: 440 + case INSN_MMIO_READ_ZERO_EXTEND: 441 + case INSN_MMIO_READ_SIGN_EXTEND: 442 442 /* Reads are handled below */ 443 443 break; 444 - case MMIO_MOVS: 445 - case MMIO_DECODE_FAILED: 444 + case INSN_MMIO_MOVS: 445 + case INSN_MMIO_DECODE_FAILED: 446 446 /* 447 447 * MMIO was accessed with an instruction that could not be 448 448 * decoded or handled properly. It was likely not using io.h ··· 459 459 return -EIO; 460 460 461 461 switch (mmio) { 462 - case MMIO_READ: 462 + case INSN_MMIO_READ: 463 463 /* Zero-extend for 32-bit operation */ 464 464 extend_size = size == 4 ? sizeof(*reg) : 0; 465 465 break; 466 - case MMIO_READ_ZERO_EXTEND: 466 + case INSN_MMIO_READ_ZERO_EXTEND: 467 467 /* Zero extend based on operand size */ 468 468 extend_size = insn.opnd_bytes; 469 469 break; 470 - case MMIO_READ_SIGN_EXTEND: 470 + case INSN_MMIO_READ_SIGN_EXTEND: 471 471 /* Sign extend based on operand size */ 472 472 extend_size = insn.opnd_bytes; 473 473 if (size == 1 && val & BIT(7))
+9 -9
arch/x86/include/asm/insn-eval.h
··· 32 32 bool insn_decode_from_regs(struct insn *insn, struct pt_regs *regs, 33 33 unsigned char buf[MAX_INSN_SIZE], int buf_size); 34 34 35 - enum mmio_type { 36 - MMIO_DECODE_FAILED, 37 - MMIO_WRITE, 38 - MMIO_WRITE_IMM, 39 - MMIO_READ, 40 - MMIO_READ_ZERO_EXTEND, 41 - MMIO_READ_SIGN_EXTEND, 42 - MMIO_MOVS, 35 + enum insn_mmio_type { 36 + INSN_MMIO_DECODE_FAILED, 37 + INSN_MMIO_WRITE, 38 + INSN_MMIO_WRITE_IMM, 39 + INSN_MMIO_READ, 40 + INSN_MMIO_READ_ZERO_EXTEND, 41 + INSN_MMIO_READ_SIGN_EXTEND, 42 + INSN_MMIO_MOVS, 43 43 }; 44 44 45 - enum mmio_type insn_decode_mmio(struct insn *insn, int *bytes); 45 + enum insn_mmio_type insn_decode_mmio(struct insn *insn, int *bytes); 46 46 47 47 #endif /* _ASM_X86_INSN_EVAL_H */
+9 -9
arch/x86/kernel/sev.c
··· 1536 1536 static enum es_result vc_handle_mmio(struct ghcb *ghcb, struct es_em_ctxt *ctxt) 1537 1537 { 1538 1538 struct insn *insn = &ctxt->insn; 1539 + enum insn_mmio_type mmio; 1539 1540 unsigned int bytes = 0; 1540 - enum mmio_type mmio; 1541 1541 enum es_result ret; 1542 1542 u8 sign_byte; 1543 1543 long *reg_data; 1544 1544 1545 1545 mmio = insn_decode_mmio(insn, &bytes); 1546 - if (mmio == MMIO_DECODE_FAILED) 1546 + if (mmio == INSN_MMIO_DECODE_FAILED) 1547 1547 return ES_DECODE_FAILED; 1548 1548 1549 - if (mmio != MMIO_WRITE_IMM && mmio != MMIO_MOVS) { 1549 + if (mmio != INSN_MMIO_WRITE_IMM && mmio != INSN_MMIO_MOVS) { 1550 1550 reg_data = insn_get_modrm_reg_ptr(insn, ctxt->regs); 1551 1551 if (!reg_data) 1552 1552 return ES_DECODE_FAILED; 1553 1553 } 1554 1554 1555 1555 switch (mmio) { 1556 - case MMIO_WRITE: 1556 + case INSN_MMIO_WRITE: 1557 1557 memcpy(ghcb->shared_buffer, reg_data, bytes); 1558 1558 ret = vc_do_mmio(ghcb, ctxt, bytes, false); 1559 1559 break; 1560 - case MMIO_WRITE_IMM: 1560 + case INSN_MMIO_WRITE_IMM: 1561 1561 memcpy(ghcb->shared_buffer, insn->immediate1.bytes, bytes); 1562 1562 ret = vc_do_mmio(ghcb, ctxt, bytes, false); 1563 1563 break; 1564 - case MMIO_READ: 1564 + case INSN_MMIO_READ: 1565 1565 ret = vc_do_mmio(ghcb, ctxt, bytes, true); 1566 1566 if (ret) 1567 1567 break; ··· 1572 1572 1573 1573 memcpy(reg_data, ghcb->shared_buffer, bytes); 1574 1574 break; 1575 - case MMIO_READ_ZERO_EXTEND: 1575 + case INSN_MMIO_READ_ZERO_EXTEND: 1576 1576 ret = vc_do_mmio(ghcb, ctxt, bytes, true); 1577 1577 if (ret) 1578 1578 break; ··· 1581 1581 memset(reg_data, 0, insn->opnd_bytes); 1582 1582 memcpy(reg_data, ghcb->shared_buffer, bytes); 1583 1583 break; 1584 - case MMIO_READ_SIGN_EXTEND: 1584 + case INSN_MMIO_READ_SIGN_EXTEND: 1585 1585 ret = vc_do_mmio(ghcb, ctxt, bytes, true); 1586 1586 if (ret) 1587 1587 break; ··· 1600 1600 memset(reg_data, sign_byte, insn->opnd_bytes); 1601 1601 memcpy(reg_data, ghcb->shared_buffer, bytes); 1602 1602 break; 1603 - case MMIO_MOVS: 1603 + case INSN_MMIO_MOVS: 1604 1604 ret = vc_handle_mmio_movs(ctxt, bytes); 1605 1605 break; 1606 1606 default:
+10 -10
arch/x86/lib/insn-eval.c
··· 1595 1595 * Returns: 1596 1596 * 1597 1597 * Type of the instruction. Size of the memory operand is stored in 1598 - * @bytes. If decode failed, MMIO_DECODE_FAILED returned. 1598 + * @bytes. If decode failed, INSN_MMIO_DECODE_FAILED returned. 1599 1599 */ 1600 - enum mmio_type insn_decode_mmio(struct insn *insn, int *bytes) 1600 + enum insn_mmio_type insn_decode_mmio(struct insn *insn, int *bytes) 1601 1601 { 1602 - enum mmio_type type = MMIO_DECODE_FAILED; 1602 + enum insn_mmio_type type = INSN_MMIO_DECODE_FAILED; 1603 1603 1604 1604 *bytes = 0; 1605 1605 1606 1606 if (insn_get_opcode(insn)) 1607 - return MMIO_DECODE_FAILED; 1607 + return INSN_MMIO_DECODE_FAILED; 1608 1608 1609 1609 switch (insn->opcode.bytes[0]) { 1610 1610 case 0x88: /* MOV m8,r8 */ ··· 1613 1613 case 0x89: /* MOV m16/m32/m64, r16/m32/m64 */ 1614 1614 if (!*bytes) 1615 1615 *bytes = insn->opnd_bytes; 1616 - type = MMIO_WRITE; 1616 + type = INSN_MMIO_WRITE; 1617 1617 break; 1618 1618 1619 1619 case 0xc6: /* MOV m8, imm8 */ ··· 1622 1622 case 0xc7: /* MOV m16/m32/m64, imm16/imm32/imm64 */ 1623 1623 if (!*bytes) 1624 1624 *bytes = insn->opnd_bytes; 1625 - type = MMIO_WRITE_IMM; 1625 + type = INSN_MMIO_WRITE_IMM; 1626 1626 break; 1627 1627 1628 1628 case 0x8a: /* MOV r8, m8 */ ··· 1631 1631 case 0x8b: /* MOV r16/r32/r64, m16/m32/m64 */ 1632 1632 if (!*bytes) 1633 1633 *bytes = insn->opnd_bytes; 1634 - type = MMIO_READ; 1634 + type = INSN_MMIO_READ; 1635 1635 break; 1636 1636 1637 1637 case 0xa4: /* MOVS m8, m8 */ ··· 1640 1640 case 0xa5: /* MOVS m16/m32/m64, m16/m32/m64 */ 1641 1641 if (!*bytes) 1642 1642 *bytes = insn->opnd_bytes; 1643 - type = MMIO_MOVS; 1643 + type = INSN_MMIO_MOVS; 1644 1644 break; 1645 1645 1646 1646 case 0x0f: /* Two-byte instruction */ ··· 1651 1651 case 0xb7: /* MOVZX r32/r64, m16 */ 1652 1652 if (!*bytes) 1653 1653 *bytes = 2; 1654 - type = MMIO_READ_ZERO_EXTEND; 1654 + type = INSN_MMIO_READ_ZERO_EXTEND; 1655 1655 break; 1656 1656 1657 1657 case 0xbe: /* MOVSX r16/r32/r64, m8 */ ··· 1660 1660 case 0xbf: /* MOVSX r32/r64, m16 */ 1661 1661 if (!*bytes) 1662 1662 *bytes = 2; 1663 - type = MMIO_READ_SIGN_EXTEND; 1663 + type = INSN_MMIO_READ_SIGN_EXTEND; 1664 1664 break; 1665 1665 } 1666 1666 break;