Lines Matching +full:short +full:- +full:descriptor

14 #include <asm/insn-eval.h>
29 * is_string_insn() - Determine if instruction is a string instruction
42 /* All string instructions have a 1-byte opcode. */ in is_string_insn()
43 if (insn->opcode.nbytes != 1) in is_string_insn()
46 switch (insn->opcode.bytes[0]) { in is_string_insn()
57 * insn_has_rep_prefix() - Determine if instruction has a REP prefix
80 * get_seg_reg_override_idx() - obtain segment register override index
91 * -EINVAL in case of error.
137 return -EINVAL; in get_seg_reg_override_idx()
143 * check_seg_overrides() - check if segment override prefixes are allowed
147 * For a particular register used in register-indirect addressing, determine if
165 * resolve_default_seg() - resolve default segment register index for an operand
179 * -EINVAL in case of error.
191 * + AX, CX and DX are not valid register operands in 16-bit address in resolve_default_seg()
192 * encodings but are valid for 32-bit and 64-bit encodings. in resolve_default_seg()
193 * + -EDOM is reserved to identify for cases in which no register in resolve_default_seg()
194 * is used (i.e., displacement-only addressing). Use DS. in resolve_default_seg()
204 if (insn->addr_bytes == 2) in resolve_default_seg()
205 return -EINVAL; in resolve_default_seg()
209 case -EDOM: in resolve_default_seg()
227 return -EINVAL; in resolve_default_seg()
232 * resolve_seg_reg() - obtain segment register index
240 * The segment register associated to an operand used in register-indirect
281 * -EINVAL in case of error.
301 return -EINVAL; in resolve_seg_reg()
327 * get_segment_selector() - obtain segment selector
343 * -EINVAL on error.
345 static short get_segment_selector(struct pt_regs *regs, int seg_reg_idx) in get_segment_selector()
348 unsigned short sel; in get_segment_selector()
354 return (unsigned short)(regs->cs & 0xffff); in get_segment_selector()
356 return (unsigned short)(regs->ss & 0xffff); in get_segment_selector()
370 return -EINVAL; in get_segment_selector()
378 return (unsigned short)(regs->cs & 0xffff); in get_segment_selector()
380 return (unsigned short)(regs->ss & 0xffff); in get_segment_selector()
382 return vm86regs->ds; in get_segment_selector()
384 return vm86regs->es; in get_segment_selector()
386 return vm86regs->fs; in get_segment_selector()
388 return vm86regs->gs; in get_segment_selector()
391 return -EINVAL; in get_segment_selector()
397 return (unsigned short)(regs->cs & 0xffff); in get_segment_selector()
399 return (unsigned short)(regs->ss & 0xffff); in get_segment_selector()
401 return (unsigned short)(regs->ds & 0xffff); in get_segment_selector()
403 return (unsigned short)(regs->es & 0xffff); in get_segment_selector()
405 return (unsigned short)(regs->fs & 0xffff); in get_segment_selector()
410 return -EINVAL; in get_segment_selector()
442 * Don't possibly decode a 32-bit instructions as in get_reg_offset()
443 * reading a 64-bit-only register. in get_reg_offset()
445 if (IS_ENABLED(CONFIG_X86_64) && !insn->x86_64) in get_reg_offset()
446 nr_registers -= 8; in get_reg_offset()
450 regno = X86_MODRM_RM(insn->modrm.value); in get_reg_offset()
453 * ModRM.mod == 0 and ModRM.rm == 5 means a 32-bit displacement in get_reg_offset()
456 if (!X86_MODRM_MOD(insn->modrm.value) && regno == 5) in get_reg_offset()
457 return -EDOM; in get_reg_offset()
459 if (X86_REX_B(insn->rex_prefix.value)) in get_reg_offset()
464 regno = X86_MODRM_REG(insn->modrm.value); in get_reg_offset()
466 if (X86_REX_R(insn->rex_prefix.value)) in get_reg_offset()
471 regno = X86_SIB_INDEX(insn->sib.value); in get_reg_offset()
472 if (X86_REX_X(insn->rex_prefix.value)) in get_reg_offset()
481 if (X86_MODRM_MOD(insn->modrm.value) != 3 && regno == 4) in get_reg_offset()
482 return -EDOM; in get_reg_offset()
486 regno = X86_SIB_BASE(insn->sib.value); in get_reg_offset()
489 * register-indirect addressing is 0. In this case, a in get_reg_offset()
490 * 32-bit displacement follows the SIB byte. in get_reg_offset()
492 if (!X86_MODRM_MOD(insn->modrm.value) && regno == 5) in get_reg_offset()
493 return -EDOM; in get_reg_offset()
495 if (X86_REX_B(insn->rex_prefix.value)) in get_reg_offset()
501 return -EINVAL; in get_reg_offset()
506 return -EINVAL; in get_reg_offset()
512 * get_reg_offset_16() - Obtain offset of register indicated by instruction
519 * in @insn. This function is to be used with 16-bit address encodings. The
522 * referenced by the instruction, the value will be set to -EDOM.
526 * 0 on success, -EINVAL on error.
532 * 16-bit addressing can use one or two registers. Specifics of in get_reg_offset_16()
533 * encodings are given in Table 2-1. "16-Bit Addressing Forms with the in get_reg_offset_16()
552 -EDOM, in get_reg_offset_16()
553 -EDOM, in get_reg_offset_16()
554 -EDOM, in get_reg_offset_16()
555 -EDOM, in get_reg_offset_16()
559 return -EINVAL; in get_reg_offset_16()
562 if (X86_MODRM_MOD(insn->modrm.value) == 3) { in get_reg_offset_16()
564 *offs2 = -EDOM; in get_reg_offset_16()
568 *offs1 = regoff1[X86_MODRM_RM(insn->modrm.value)]; in get_reg_offset_16()
569 *offs2 = regoff2[X86_MODRM_RM(insn->modrm.value)]; in get_reg_offset_16()
572 * If ModRM.mod is 0 and ModRM.rm is 110b, then we use displacement- in get_reg_offset_16()
578 if ((X86_MODRM_MOD(insn->modrm.value) == 0) && in get_reg_offset_16()
579 (X86_MODRM_RM(insn->modrm.value) == 6)) in get_reg_offset_16()
580 *offs1 = -EDOM; in get_reg_offset_16()
586 * get_desc() - Obtain contents of a segment descriptor
587 * @out: Segment descriptor contents on success
590 * Given a segment selector, obtain a pointer to the segment descriptor.
591 * Both global and local descriptor tables are supported.
599 static bool get_desc(struct desc_struct *out, unsigned short sel) in get_desc()
612 mutex_lock(&current->active_mm->context.lock); in get_desc()
613 ldt = current->active_mm->context.ldt; in get_desc()
614 if (ldt && sel < ldt->nr_entries) { in get_desc()
615 *out = ldt->entries[sel]; in get_desc()
619 mutex_unlock(&current->active_mm->context.lock); in get_desc()
628 * multiplied by 8 to obtain the memory offset of the desired descriptor in get_desc()
643 * insn_get_seg_base() - Obtain base address of segment descriptor.
645 * @seg_reg_idx: Index of the segment register pointing to seg descriptor
647 * Obtain the base address of the segment as indicated by the segment descriptor
654 * except when FS or GS are used. In virtual-8086 mode, the segment
657 * -1L in case of error.
662 short sel; in insn_get_seg_base()
666 return -1L; in insn_get_seg_base()
687 * MSR_KERNEL_GS_BASE will have the user-space GS base. in insn_get_seg_base()
701 return -1L; in insn_get_seg_base()
704 return -1L; in insn_get_seg_base()
710 * get_seg_limit() - Obtain the limit of a segment descriptor
712 * @seg_reg_idx: Index of the segment register pointing to seg descriptor
714 * Obtain the limit of the segment as indicated by the segment descriptor
720 * In protected mode, the limit of the segment descriptor in bytes.
721 * In long mode and virtual-8086 mode, segment limits are not enforced. Thus,
722 * limit is returned as -1L to imply a limit-less segment.
730 short sel; in get_seg_limit()
737 return -1L; in get_seg_limit()
759 * insn_get_code_seg_params() - Obtain code segment parameters
765 * descriptor. In virtual-8086 mode, the default is always two bytes for both
770 * An int containing ORed-in default parameters on success.
772 * -EINVAL on error.
777 short sel; in insn_get_code_seg_params()
780 /* Address and operand size are both 16-bit. */ in insn_get_code_seg_params()
788 return -EINVAL; in insn_get_code_seg_params()
791 * The most significant byte of the Type field of the segment descriptor in insn_get_code_seg_params()
796 return -EINVAL; in insn_get_code_seg_params()
801 * both 16-bit. in insn_get_code_seg_params()
806 * both 32-bit. in insn_get_code_seg_params()
810 * IA-32e 64-bit mode. CS.L=1, CS.D=0. Address size is 64-bit; in insn_get_code_seg_params()
811 * operand size is 32-bit. in insn_get_code_seg_params()
817 return -EINVAL; in insn_get_code_seg_params()
822 * insn_get_modrm_rm_off() - Obtain register in r/m part of the ModRM byte
830 * cases, the returned value can be -EDOM to indicate that the particular value
839 * insn_get_modrm_reg_off() - Obtain register in reg part of the ModRM byte
854 * get_seg_base_limit() - obtain base address and limit of a segment
857 * @regoff: Operand offset, in pt_regs, used to resolve segment descriptor
872 * -EINVAL on error.
881 return -EINVAL; in get_seg_base_limit()
888 if (*base == -1L) in get_seg_base_limit()
889 return -EINVAL; in get_seg_base_limit()
896 return -EINVAL; in get_seg_base_limit()
902 * get_eff_addr_reg() - Obtain effective address from register operand
922 * -EINVAL on error.
933 if (X86_MODRM_MOD(insn->modrm.value) != 3) in get_eff_addr_reg()
934 return -EINVAL; in get_eff_addr_reg()
938 return -EINVAL; in get_eff_addr_reg()
941 if (insn->addr_bytes == 2) in get_eff_addr_reg()
943 else if (insn->addr_bytes == 4) in get_eff_addr_reg()
945 else /* 64-bit address */ in get_eff_addr_reg()
952 * get_eff_addr_modrm() - Obtain referenced effective address via ModRM
959 * identifying the registers involved in the register-indirect memory reference,
971 * -EINVAL on error.
979 if (insn->addr_bytes != 8 && insn->addr_bytes != 4) in get_eff_addr_modrm()
980 return -EINVAL; in get_eff_addr_modrm()
986 if (X86_MODRM_MOD(insn->modrm.value) > 2) in get_eff_addr_modrm()
987 return -EINVAL; in get_eff_addr_modrm()
992 * -EDOM means that we must ignore the address_offset. In such a case, in get_eff_addr_modrm()
993 * in 64-bit mode the effective address relative to the rIP of the in get_eff_addr_modrm()
996 if (*regoff == -EDOM) { in get_eff_addr_modrm()
998 tmp = regs->ip + insn->length; in get_eff_addr_modrm()
1002 return -EINVAL; in get_eff_addr_modrm()
1007 if (insn->addr_bytes == 4) { in get_eff_addr_modrm()
1008 int addr32 = (int)(tmp & 0xffffffff) + insn->displacement.value; in get_eff_addr_modrm()
1012 *eff_addr = tmp + insn->displacement.value; in get_eff_addr_modrm()
1019 * get_eff_addr_modrm_16() - Obtain referenced effective address via ModRM
1025 * Obtain the 16-bit effective address referenced by the ModRM byte of @insn.
1026 * After identifying the registers involved in the register-indirect memory
1038 * -EINVAL on error.
1041 int *regoff, short *eff_addr) in get_eff_addr_modrm_16()
1044 short addr1 = 0, addr2 = 0, displacement; in get_eff_addr_modrm_16()
1046 if (insn->addr_bytes != 2) in get_eff_addr_modrm_16()
1047 return -EINVAL; in get_eff_addr_modrm_16()
1051 if (!insn->modrm.nbytes) in get_eff_addr_modrm_16()
1052 return -EINVAL; in get_eff_addr_modrm_16()
1054 if (X86_MODRM_MOD(insn->modrm.value) > 2) in get_eff_addr_modrm_16()
1055 return -EINVAL; in get_eff_addr_modrm_16()
1059 return -EINVAL; in get_eff_addr_modrm_16()
1066 if (addr_offset1 != -EDOM) in get_eff_addr_modrm_16()
1069 if (addr_offset2 != -EDOM) in get_eff_addr_modrm_16()
1072 displacement = insn->displacement.value & 0xffff; in get_eff_addr_modrm_16()
1087 * get_eff_addr_sib() - Obtain referenced effective address via SIB
1094 * identifying the registers involved in the indexed, register-indirect memory
1115 if (insn->addr_bytes != 8 && insn->addr_bytes != 4) in get_eff_addr_sib()
1116 return -EINVAL; in get_eff_addr_sib()
1122 if (!insn->modrm.nbytes) in get_eff_addr_sib()
1123 return -EINVAL; in get_eff_addr_sib()
1125 if (X86_MODRM_MOD(insn->modrm.value) > 2) in get_eff_addr_sib()
1126 return -EINVAL; in get_eff_addr_sib()
1132 if (!insn->sib.nbytes) in get_eff_addr_sib()
1133 return -EINVAL; in get_eff_addr_sib()
1140 * decoding the SIB byte. Except -EDOM, which means that the registers in get_eff_addr_sib()
1143 if (*base_offset == -EDOM) in get_eff_addr_sib()
1146 return -EINVAL; in get_eff_addr_sib()
1150 if (indx_offset == -EDOM) in get_eff_addr_sib()
1153 return -EINVAL; in get_eff_addr_sib()
1157 if (insn->addr_bytes == 4) { in get_eff_addr_sib()
1163 addr32 = base32 + idx32 * (1 << X86_SIB_SCALE(insn->sib.value)); in get_eff_addr_sib()
1164 addr32 += insn->displacement.value; in get_eff_addr_sib()
1168 *eff_addr = base + indx * (1 << X86_SIB_SCALE(insn->sib.value)); in get_eff_addr_sib()
1169 *eff_addr += insn->displacement.value; in get_eff_addr_sib()
1176 * get_addr_ref_16() - Obtain the 16-bit address referred by instruction
1180 * This function is to be used with 16-bit address encodings. Obtain the memory
1190 * -1L on error.
1194 unsigned long linear_addr = -1L, seg_base, seg_limit; in get_addr_ref_16()
1196 short eff_addr; in get_addr_ref_16()
1202 if (insn->addr_bytes != 2) in get_addr_ref_16()
1205 if (X86_MODRM_MOD(insn->modrm.value) == 3) { in get_addr_ref_16()
1223 * is within the limits of the segment. In virtual-8086 mode, segment in get_addr_ref_16()
1224 * limits are not enforced. In such a case, the segment limit is -1L to in get_addr_ref_16()
1241 * get_addr_ref_32() - Obtain a 32-bit linear address
1245 * This function is to be used with 32-bit address encodings to obtain the
1254 * -1L on error.
1258 unsigned long linear_addr = -1L, seg_base, seg_limit; in get_addr_ref_32()
1263 if (insn->addr_bytes != 4) in get_addr_ref_32()
1266 if (X86_MODRM_MOD(insn->modrm.value) == 3) { in get_addr_ref_32()
1274 if (insn->sib.nbytes) { in get_addr_ref_32()
1296 * 32-bit addresses can be used in long and virtual-8086 modes if an in get_addr_ref_32()
1298 * not enforced. When in virtual-8086 mode, the segment limit is -1L in get_addr_ref_32()
1308 * Even though 32-bit address encodings are allowed in virtual-8086 in get_addr_ref_32()
1309 * mode, the address range is still limited to [0x-0xffff]. in get_addr_ref_32()
1315 * Data type long could be 64 bits in size. Ensure that our 32-bit in get_addr_ref_32()
1316 * effective address is not sign-extended when computing the linear in get_addr_ref_32()
1330 * get_addr_ref_64() - Obtain a 64-bit linear address
1334 * This function is to be used with 64-bit address encodings to obtain the
1342 * -1L on error.
1347 return (void __user *)-1L; in get_addr_ref_64()
1352 unsigned long linear_addr = -1L, seg_base; in get_addr_ref_64()
1356 if (insn->addr_bytes != 8) in get_addr_ref_64()
1359 if (X86_MODRM_MOD(insn->modrm.value) == 3) { in get_addr_ref_64()
1365 if (insn->sib.nbytes) { in get_addr_ref_64()
1389 * insn_get_addr_ref() - Obtain the linear address referred by instruction
1401 * -1L on error.
1406 return (void __user *)-1L; in insn_get_addr_ref()
1408 switch (insn->addr_bytes) { in insn_get_addr_ref()
1416 return (void __user *)-1L; in insn_get_addr_ref()
1425 * If not in user-space long mode, a custom code segment could be in in insn_get_effective_ip()
1427 * descriptor table), or virtual-8086 mode. In most of the cases in insn_get_effective_ip()
1432 if (seg_base == -1L) in insn_get_effective_ip()
1433 return -EINVAL; in insn_get_effective_ip()
1436 *ip = seg_base + regs->ip; in insn_get_effective_ip()
1442 * insn_fetch_from_user() - Copy instruction bytes from user-space memory
1451 * - number of instruction bytes copied.
1452 * - 0 if nothing was copied.
1453 * - -EINVAL if the linear address of the instruction could not be calculated
1461 return -EINVAL; in insn_fetch_from_user()
1465 return MAX_INSN_SIZE - not_copied; in insn_fetch_from_user()
1469 * insn_fetch_from_user_inatomic() - Copy instruction bytes from user-space memory
1479 * - number of instruction bytes copied.
1480 * - 0 if nothing was copied.
1481 * - -EINVAL if the linear address of the instruction could not be calculated.
1489 return -EINVAL; in insn_fetch_from_user_inatomic()
1493 return MAX_INSN_SIZE - not_copied; in insn_fetch_from_user_inatomic()
1497 * insn_decode_from_regs() - Decode an instruction
1519 * in the code segment descriptor. The instruction decoder only sets in insn_decode_from_regs()
1522 * have special cases where, for instance, a 16-bit code segment in insn_decode_from_regs()
1523 * descriptor is used. in insn_decode_from_regs()
1525 * correctly updates these values, even for 16-bit defaults. in insn_decode_from_regs()
1528 if (seg_defs == -EINVAL) in insn_decode_from_regs()
1531 insn->addr_bytes = INSN_CODE_SEG_ADDR_SZ(seg_defs); in insn_decode_from_regs()
1532 insn->opnd_bytes = INSN_CODE_SEG_OPND_SZ(seg_defs); in insn_decode_from_regs()
1537 if (buf_size < insn->length) in insn_decode_from_regs()