0001
0002
0003
0004
0005
0006 #include <linux/kernel.h>
0007 #include <linux/string.h>
0008 #include <linux/ratelimit.h>
0009 #include <linux/mmu_context.h>
0010 #include <asm/desc_defs.h>
0011 #include <asm/desc.h>
0012 #include <asm/inat.h>
0013 #include <asm/insn.h>
0014 #include <asm/insn-eval.h>
0015 #include <asm/ldt.h>
0016 #include <asm/vm86.h>
0017
0018 #undef pr_fmt
0019 #define pr_fmt(fmt) "insn: " fmt
0020
0021 enum reg_type {
0022 REG_TYPE_RM = 0,
0023 REG_TYPE_REG,
0024 REG_TYPE_INDEX,
0025 REG_TYPE_BASE,
0026 };
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038 static bool is_string_insn(struct insn *insn)
0039 {
0040
0041 if (insn->opcode.nbytes != 1)
0042 return false;
0043
0044 switch (insn->opcode.bytes[0]) {
0045 case 0x6c ... 0x6f:
0046 case 0xa4 ... 0xa7:
0047 case 0xaa ... 0xaf:
0048 return true;
0049 default:
0050 return false;
0051 }
0052 }
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062 bool insn_has_rep_prefix(struct insn *insn)
0063 {
0064 insn_byte_t p;
0065 int i;
0066
0067 insn_get_prefixes(insn);
0068
0069 for_each_insn_prefix(insn, i, p) {
0070 if (p == 0xf2 || p == 0xf3)
0071 return true;
0072 }
0073
0074 return false;
0075 }
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091 static int get_seg_reg_override_idx(struct insn *insn)
0092 {
0093 int idx = INAT_SEG_REG_DEFAULT;
0094 int num_overrides = 0, i;
0095 insn_byte_t p;
0096
0097 insn_get_prefixes(insn);
0098
0099
0100 for_each_insn_prefix(insn, i, p) {
0101 insn_attr_t attr;
0102
0103 attr = inat_get_opcode_attribute(p);
0104 switch (attr) {
0105 case INAT_MAKE_PREFIX(INAT_PFX_CS):
0106 idx = INAT_SEG_REG_CS;
0107 num_overrides++;
0108 break;
0109 case INAT_MAKE_PREFIX(INAT_PFX_SS):
0110 idx = INAT_SEG_REG_SS;
0111 num_overrides++;
0112 break;
0113 case INAT_MAKE_PREFIX(INAT_PFX_DS):
0114 idx = INAT_SEG_REG_DS;
0115 num_overrides++;
0116 break;
0117 case INAT_MAKE_PREFIX(INAT_PFX_ES):
0118 idx = INAT_SEG_REG_ES;
0119 num_overrides++;
0120 break;
0121 case INAT_MAKE_PREFIX(INAT_PFX_FS):
0122 idx = INAT_SEG_REG_FS;
0123 num_overrides++;
0124 break;
0125 case INAT_MAKE_PREFIX(INAT_PFX_GS):
0126 idx = INAT_SEG_REG_GS;
0127 num_overrides++;
0128 break;
0129
0130 }
0131 }
0132
0133
0134 if (num_overrides > 1)
0135 return -EINVAL;
0136
0137 return idx;
0138 }
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154 static bool check_seg_overrides(struct insn *insn, int regoff)
0155 {
0156 if (regoff == offsetof(struct pt_regs, di) && is_string_insn(insn))
0157 return false;
0158
0159 return true;
0160 }
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179 static int resolve_default_seg(struct insn *insn, struct pt_regs *regs, int off)
0180 {
0181 if (any_64bit_mode(regs))
0182 return INAT_SEG_REG_IGNORE;
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197 switch (off) {
0198 case offsetof(struct pt_regs, ax):
0199 case offsetof(struct pt_regs, cx):
0200 case offsetof(struct pt_regs, dx):
0201
0202 if (insn->addr_bytes == 2)
0203 return -EINVAL;
0204
0205 fallthrough;
0206
0207 case -EDOM:
0208 case offsetof(struct pt_regs, bx):
0209 case offsetof(struct pt_regs, si):
0210 return INAT_SEG_REG_DS;
0211
0212 case offsetof(struct pt_regs, di):
0213 if (is_string_insn(insn))
0214 return INAT_SEG_REG_ES;
0215 return INAT_SEG_REG_DS;
0216
0217 case offsetof(struct pt_regs, bp):
0218 case offsetof(struct pt_regs, sp):
0219 return INAT_SEG_REG_SS;
0220
0221 case offsetof(struct pt_regs, ip):
0222 return INAT_SEG_REG_CS;
0223
0224 default:
0225 return -EINVAL;
0226 }
0227 }
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281 static int resolve_seg_reg(struct insn *insn, struct pt_regs *regs, int regoff)
0282 {
0283 int idx;
0284
0285
0286
0287
0288
0289
0290
0291 if (regoff == offsetof(struct pt_regs, ip)) {
0292 if (any_64bit_mode(regs))
0293 return INAT_SEG_REG_IGNORE;
0294 else
0295 return INAT_SEG_REG_CS;
0296 }
0297
0298 if (!insn)
0299 return -EINVAL;
0300
0301 if (!check_seg_overrides(insn, regoff))
0302 return resolve_default_seg(insn, regs, regoff);
0303
0304 idx = get_seg_reg_override_idx(insn);
0305 if (idx < 0)
0306 return idx;
0307
0308 if (idx == INAT_SEG_REG_DEFAULT)
0309 return resolve_default_seg(insn, regs, regoff);
0310
0311
0312
0313
0314
0315 if (any_64bit_mode(regs)) {
0316 if (idx != INAT_SEG_REG_FS &&
0317 idx != INAT_SEG_REG_GS)
0318 idx = INAT_SEG_REG_IGNORE;
0319 }
0320
0321 return idx;
0322 }
0323
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339
0340
0341
0342
0343 static short get_segment_selector(struct pt_regs *regs, int seg_reg_idx)
0344 {
0345 unsigned short sel;
0346
0347 #ifdef CONFIG_X86_64
0348 switch (seg_reg_idx) {
0349 case INAT_SEG_REG_IGNORE:
0350 return 0;
0351 case INAT_SEG_REG_CS:
0352 return (unsigned short)(regs->cs & 0xffff);
0353 case INAT_SEG_REG_SS:
0354 return (unsigned short)(regs->ss & 0xffff);
0355 case INAT_SEG_REG_DS:
0356 savesegment(ds, sel);
0357 return sel;
0358 case INAT_SEG_REG_ES:
0359 savesegment(es, sel);
0360 return sel;
0361 case INAT_SEG_REG_FS:
0362 savesegment(fs, sel);
0363 return sel;
0364 case INAT_SEG_REG_GS:
0365 savesegment(gs, sel);
0366 return sel;
0367 default:
0368 return -EINVAL;
0369 }
0370 #else
0371 struct kernel_vm86_regs *vm86regs = (struct kernel_vm86_regs *)regs;
0372
0373 if (v8086_mode(regs)) {
0374 switch (seg_reg_idx) {
0375 case INAT_SEG_REG_CS:
0376 return (unsigned short)(regs->cs & 0xffff);
0377 case INAT_SEG_REG_SS:
0378 return (unsigned short)(regs->ss & 0xffff);
0379 case INAT_SEG_REG_DS:
0380 return vm86regs->ds;
0381 case INAT_SEG_REG_ES:
0382 return vm86regs->es;
0383 case INAT_SEG_REG_FS:
0384 return vm86regs->fs;
0385 case INAT_SEG_REG_GS:
0386 return vm86regs->gs;
0387 case INAT_SEG_REG_IGNORE:
0388 default:
0389 return -EINVAL;
0390 }
0391 }
0392
0393 switch (seg_reg_idx) {
0394 case INAT_SEG_REG_CS:
0395 return (unsigned short)(regs->cs & 0xffff);
0396 case INAT_SEG_REG_SS:
0397 return (unsigned short)(regs->ss & 0xffff);
0398 case INAT_SEG_REG_DS:
0399 return (unsigned short)(regs->ds & 0xffff);
0400 case INAT_SEG_REG_ES:
0401 return (unsigned short)(regs->es & 0xffff);
0402 case INAT_SEG_REG_FS:
0403 return (unsigned short)(regs->fs & 0xffff);
0404 case INAT_SEG_REG_GS:
0405 savesegment(gs, sel);
0406 return sel;
0407 case INAT_SEG_REG_IGNORE:
0408 default:
0409 return -EINVAL;
0410 }
0411 #endif
0412 }
0413
0414 static const int pt_regoff[] = {
0415 offsetof(struct pt_regs, ax),
0416 offsetof(struct pt_regs, cx),
0417 offsetof(struct pt_regs, dx),
0418 offsetof(struct pt_regs, bx),
0419 offsetof(struct pt_regs, sp),
0420 offsetof(struct pt_regs, bp),
0421 offsetof(struct pt_regs, si),
0422 offsetof(struct pt_regs, di),
0423 #ifdef CONFIG_X86_64
0424 offsetof(struct pt_regs, r8),
0425 offsetof(struct pt_regs, r9),
0426 offsetof(struct pt_regs, r10),
0427 offsetof(struct pt_regs, r11),
0428 offsetof(struct pt_regs, r12),
0429 offsetof(struct pt_regs, r13),
0430 offsetof(struct pt_regs, r14),
0431 offsetof(struct pt_regs, r15),
0432 #else
0433 offsetof(struct pt_regs, ds),
0434 offsetof(struct pt_regs, es),
0435 offsetof(struct pt_regs, fs),
0436 offsetof(struct pt_regs, gs),
0437 #endif
0438 };
0439
0440 int pt_regs_offset(struct pt_regs *regs, int regno)
0441 {
0442 if ((unsigned)regno < ARRAY_SIZE(pt_regoff))
0443 return pt_regoff[regno];
0444 return -EDOM;
0445 }
0446
0447 static int get_regno(struct insn *insn, enum reg_type type)
0448 {
0449 int nr_registers = ARRAY_SIZE(pt_regoff);
0450 int regno = 0;
0451
0452
0453
0454
0455
0456 if (IS_ENABLED(CONFIG_X86_64) && !insn->x86_64)
0457 nr_registers -= 8;
0458
0459 switch (type) {
0460 case REG_TYPE_RM:
0461 regno = X86_MODRM_RM(insn->modrm.value);
0462
0463
0464
0465
0466
0467 if (!X86_MODRM_MOD(insn->modrm.value) && regno == 5)
0468 return -EDOM;
0469
0470 if (X86_REX_B(insn->rex_prefix.value))
0471 regno += 8;
0472 break;
0473
0474 case REG_TYPE_REG:
0475 regno = X86_MODRM_REG(insn->modrm.value);
0476
0477 if (X86_REX_R(insn->rex_prefix.value))
0478 regno += 8;
0479 break;
0480
0481 case REG_TYPE_INDEX:
0482 regno = X86_SIB_INDEX(insn->sib.value);
0483 if (X86_REX_X(insn->rex_prefix.value))
0484 regno += 8;
0485
0486
0487
0488
0489
0490
0491
0492 if (X86_MODRM_MOD(insn->modrm.value) != 3 && regno == 4)
0493 return -EDOM;
0494 break;
0495
0496 case REG_TYPE_BASE:
0497 regno = X86_SIB_BASE(insn->sib.value);
0498
0499
0500
0501
0502
0503 if (!X86_MODRM_MOD(insn->modrm.value) && regno == 5)
0504 return -EDOM;
0505
0506 if (X86_REX_B(insn->rex_prefix.value))
0507 regno += 8;
0508 break;
0509
0510 default:
0511 pr_err_ratelimited("invalid register type: %d\n", type);
0512 return -EINVAL;
0513 }
0514
0515 if (regno >= nr_registers) {
0516 WARN_ONCE(1, "decoded an instruction with an invalid register");
0517 return -EINVAL;
0518 }
0519 return regno;
0520 }
0521
0522 static int get_reg_offset(struct insn *insn, struct pt_regs *regs,
0523 enum reg_type type)
0524 {
0525 int regno = get_regno(insn, type);
0526
0527 if (regno < 0)
0528 return regno;
0529
0530 return pt_regs_offset(regs, regno);
0531 }
0532
0533
0534
0535
0536
0537
0538
0539
0540
0541
0542
0543
0544
0545
0546
0547
0548
0549
0550 static int get_reg_offset_16(struct insn *insn, struct pt_regs *regs,
0551 int *offs1, int *offs2)
0552 {
0553
0554
0555
0556
0557
0558 static const int regoff1[] = {
0559 offsetof(struct pt_regs, bx),
0560 offsetof(struct pt_regs, bx),
0561 offsetof(struct pt_regs, bp),
0562 offsetof(struct pt_regs, bp),
0563 offsetof(struct pt_regs, si),
0564 offsetof(struct pt_regs, di),
0565 offsetof(struct pt_regs, bp),
0566 offsetof(struct pt_regs, bx),
0567 };
0568
0569 static const int regoff2[] = {
0570 offsetof(struct pt_regs, si),
0571 offsetof(struct pt_regs, di),
0572 offsetof(struct pt_regs, si),
0573 offsetof(struct pt_regs, di),
0574 -EDOM,
0575 -EDOM,
0576 -EDOM,
0577 -EDOM,
0578 };
0579
0580 if (!offs1 || !offs2)
0581 return -EINVAL;
0582
0583
0584 if (X86_MODRM_MOD(insn->modrm.value) == 3) {
0585 *offs1 = insn_get_modrm_rm_off(insn, regs);
0586 *offs2 = -EDOM;
0587 return 0;
0588 }
0589
0590 *offs1 = regoff1[X86_MODRM_RM(insn->modrm.value)];
0591 *offs2 = regoff2[X86_MODRM_RM(insn->modrm.value)];
0592
0593
0594
0595
0596
0597
0598
0599
0600 if ((X86_MODRM_MOD(insn->modrm.value) == 0) &&
0601 (X86_MODRM_RM(insn->modrm.value) == 6))
0602 *offs1 = -EDOM;
0603
0604 return 0;
0605 }
0606
0607
0608
0609
0610
0611
0612
0613
0614
0615
0616
0617
0618
0619
0620
0621 static bool get_desc(struct desc_struct *out, unsigned short sel)
0622 {
0623 struct desc_ptr gdt_desc = {0, 0};
0624 unsigned long desc_base;
0625
0626 #ifdef CONFIG_MODIFY_LDT_SYSCALL
0627 if ((sel & SEGMENT_TI_MASK) == SEGMENT_LDT) {
0628 bool success = false;
0629 struct ldt_struct *ldt;
0630
0631
0632 sel >>= 3;
0633
0634 mutex_lock(¤t->active_mm->context.lock);
0635 ldt = current->active_mm->context.ldt;
0636 if (ldt && sel < ldt->nr_entries) {
0637 *out = ldt->entries[sel];
0638 success = true;
0639 }
0640
0641 mutex_unlock(¤t->active_mm->context.lock);
0642
0643 return success;
0644 }
0645 #endif
0646 native_store_gdt(&gdt_desc);
0647
0648
0649
0650
0651
0652
0653
0654
0655 desc_base = sel & ~(SEGMENT_RPL_MASK | SEGMENT_TI_MASK);
0656
0657 if (desc_base > gdt_desc.size)
0658 return false;
0659
0660 *out = *(struct desc_struct *)(gdt_desc.address + desc_base);
0661 return true;
0662 }
0663
0664
0665
0666
0667
0668
0669
0670
0671
0672
0673
0674
0675
0676
0677
0678
0679
0680
0681 unsigned long insn_get_seg_base(struct pt_regs *regs, int seg_reg_idx)
0682 {
0683 struct desc_struct desc;
0684 short sel;
0685
0686 sel = get_segment_selector(regs, seg_reg_idx);
0687 if (sel < 0)
0688 return -1L;
0689
0690 if (v8086_mode(regs))
0691
0692
0693
0694
0695 return (unsigned long)(sel << 4);
0696
0697 if (any_64bit_mode(regs)) {
0698
0699
0700
0701
0702 unsigned long base;
0703
0704 if (seg_reg_idx == INAT_SEG_REG_FS) {
0705 rdmsrl(MSR_FS_BASE, base);
0706 } else if (seg_reg_idx == INAT_SEG_REG_GS) {
0707
0708
0709
0710
0711 if (user_mode(regs))
0712 rdmsrl(MSR_KERNEL_GS_BASE, base);
0713 else
0714 rdmsrl(MSR_GS_BASE, base);
0715 } else {
0716 base = 0;
0717 }
0718 return base;
0719 }
0720
0721
0722 if (!sel)
0723 return -1L;
0724
0725 if (!get_desc(&desc, sel))
0726 return -1L;
0727
0728 return get_desc_base(&desc);
0729 }
0730
0731
0732
0733
0734
0735
0736
0737
0738
0739
0740
0741
0742
0743
0744
0745
0746
0747
0748 static unsigned long get_seg_limit(struct pt_regs *regs, int seg_reg_idx)
0749 {
0750 struct desc_struct desc;
0751 unsigned long limit;
0752 short sel;
0753
0754 sel = get_segment_selector(regs, seg_reg_idx);
0755 if (sel < 0)
0756 return 0;
0757
0758 if (any_64bit_mode(regs) || v8086_mode(regs))
0759 return -1L;
0760
0761 if (!sel)
0762 return 0;
0763
0764 if (!get_desc(&desc, sel))
0765 return 0;
0766
0767
0768
0769
0770
0771
0772
0773 limit = get_desc_limit(&desc);
0774 if (desc.g)
0775 limit = (limit << 12) + 0xfff;
0776
0777 return limit;
0778 }
0779
0780
0781
0782
0783
0784
0785
0786
0787
0788
0789
0790
0791
0792
0793
0794
0795
0796 int insn_get_code_seg_params(struct pt_regs *regs)
0797 {
0798 struct desc_struct desc;
0799 short sel;
0800
0801 if (v8086_mode(regs))
0802
0803 return INSN_CODE_SEG_PARAMS(2, 2);
0804
0805 sel = get_segment_selector(regs, INAT_SEG_REG_CS);
0806 if (sel < 0)
0807 return sel;
0808
0809 if (!get_desc(&desc, sel))
0810 return -EINVAL;
0811
0812
0813
0814
0815
0816
0817 if (!(desc.type & BIT(3)))
0818 return -EINVAL;
0819
0820 switch ((desc.l << 1) | desc.d) {
0821 case 0:
0822
0823
0824
0825 return INSN_CODE_SEG_PARAMS(2, 2);
0826 case 1:
0827
0828
0829
0830 return INSN_CODE_SEG_PARAMS(4, 4);
0831 case 2:
0832
0833
0834
0835 return INSN_CODE_SEG_PARAMS(4, 8);
0836 case 3:
0837 fallthrough;
0838 default:
0839 return -EINVAL;
0840 }
0841 }
0842
0843
0844
0845
0846
0847
0848
0849
0850
0851
0852
0853
0854
0855 int insn_get_modrm_rm_off(struct insn *insn, struct pt_regs *regs)
0856 {
0857 return get_reg_offset(insn, regs, REG_TYPE_RM);
0858 }
0859
0860
0861
0862
0863
0864
0865
0866
0867
0868
0869
0870 int insn_get_modrm_reg_off(struct insn *insn, struct pt_regs *regs)
0871 {
0872 return get_reg_offset(insn, regs, REG_TYPE_REG);
0873 }
0874
0875
0876
0877
0878
0879
0880
0881
0882
0883
0884
0885 unsigned long *insn_get_modrm_reg_ptr(struct insn *insn, struct pt_regs *regs)
0886 {
0887 int offset;
0888
0889 offset = insn_get_modrm_reg_off(insn, regs);
0890 if (offset < 0)
0891 return NULL;
0892 return (void *)regs + offset;
0893 }
0894
0895
0896
0897
0898
0899
0900
0901
0902
0903
0904
0905
0906
0907
0908
0909
0910
0911
0912
0913
0914
0915
0916 static int get_seg_base_limit(struct insn *insn, struct pt_regs *regs,
0917 int regoff, unsigned long *base,
0918 unsigned long *limit)
0919 {
0920 int seg_reg_idx;
0921
0922 if (!base)
0923 return -EINVAL;
0924
0925 seg_reg_idx = resolve_seg_reg(insn, regs, regoff);
0926 if (seg_reg_idx < 0)
0927 return seg_reg_idx;
0928
0929 *base = insn_get_seg_base(regs, seg_reg_idx);
0930 if (*base == -1L)
0931 return -EINVAL;
0932
0933 if (!limit)
0934 return 0;
0935
0936 *limit = get_seg_limit(regs, seg_reg_idx);
0937 if (!(*limit))
0938 return -EINVAL;
0939
0940 return 0;
0941 }
0942
0943
0944
0945
0946
0947
0948
0949
0950
0951
0952
0953
0954
0955
0956
0957
0958
0959
0960
0961
0962
0963
0964
0965
0966 static int get_eff_addr_reg(struct insn *insn, struct pt_regs *regs,
0967 int *regoff, long *eff_addr)
0968 {
0969 int ret;
0970
0971 ret = insn_get_modrm(insn);
0972 if (ret)
0973 return ret;
0974
0975 if (X86_MODRM_MOD(insn->modrm.value) != 3)
0976 return -EINVAL;
0977
0978 *regoff = get_reg_offset(insn, regs, REG_TYPE_RM);
0979 if (*regoff < 0)
0980 return -EINVAL;
0981
0982
0983 if (insn->addr_bytes == 2)
0984 *eff_addr = regs_get_register(regs, *regoff) & 0xffff;
0985 else if (insn->addr_bytes == 4)
0986 *eff_addr = regs_get_register(regs, *regoff) & 0xffffffff;
0987 else
0988 *eff_addr = regs_get_register(regs, *regoff);
0989
0990 return 0;
0991 }
0992
0993
0994
0995
0996
0997
0998
0999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015 static int get_eff_addr_modrm(struct insn *insn, struct pt_regs *regs,
1016 int *regoff, long *eff_addr)
1017 {
1018 long tmp;
1019 int ret;
1020
1021 if (insn->addr_bytes != 8 && insn->addr_bytes != 4)
1022 return -EINVAL;
1023
1024 ret = insn_get_modrm(insn);
1025 if (ret)
1026 return ret;
1027
1028 if (X86_MODRM_MOD(insn->modrm.value) > 2)
1029 return -EINVAL;
1030
1031 *regoff = get_reg_offset(insn, regs, REG_TYPE_RM);
1032
1033
1034
1035
1036
1037
1038 if (*regoff == -EDOM) {
1039 if (any_64bit_mode(regs))
1040 tmp = regs->ip + insn->length;
1041 else
1042 tmp = 0;
1043 } else if (*regoff < 0) {
1044 return -EINVAL;
1045 } else {
1046 tmp = regs_get_register(regs, *regoff);
1047 }
1048
1049 if (insn->addr_bytes == 4) {
1050 int addr32 = (int)(tmp & 0xffffffff) + insn->displacement.value;
1051
1052 *eff_addr = addr32 & 0xffffffff;
1053 } else {
1054 *eff_addr = tmp + insn->displacement.value;
1055 }
1056
1057 return 0;
1058 }
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082 static int get_eff_addr_modrm_16(struct insn *insn, struct pt_regs *regs,
1083 int *regoff, short *eff_addr)
1084 {
1085 int addr_offset1, addr_offset2, ret;
1086 short addr1 = 0, addr2 = 0, displacement;
1087
1088 if (insn->addr_bytes != 2)
1089 return -EINVAL;
1090
1091 insn_get_modrm(insn);
1092
1093 if (!insn->modrm.nbytes)
1094 return -EINVAL;
1095
1096 if (X86_MODRM_MOD(insn->modrm.value) > 2)
1097 return -EINVAL;
1098
1099 ret = get_reg_offset_16(insn, regs, &addr_offset1, &addr_offset2);
1100 if (ret < 0)
1101 return -EINVAL;
1102
1103
1104
1105
1106
1107
1108 if (addr_offset1 != -EDOM)
1109 addr1 = regs_get_register(regs, addr_offset1) & 0xffff;
1110
1111 if (addr_offset2 != -EDOM)
1112 addr2 = regs_get_register(regs, addr_offset2) & 0xffff;
1113
1114 displacement = insn->displacement.value & 0xffff;
1115 *eff_addr = addr1 + addr2 + displacement;
1116
1117
1118
1119
1120
1121
1122
1123 *regoff = addr_offset1;
1124
1125 return 0;
1126 }
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150 static int get_eff_addr_sib(struct insn *insn, struct pt_regs *regs,
1151 int *base_offset, long *eff_addr)
1152 {
1153 long base, indx;
1154 int indx_offset;
1155 int ret;
1156
1157 if (insn->addr_bytes != 8 && insn->addr_bytes != 4)
1158 return -EINVAL;
1159
1160 ret = insn_get_modrm(insn);
1161 if (ret)
1162 return ret;
1163
1164 if (!insn->modrm.nbytes)
1165 return -EINVAL;
1166
1167 if (X86_MODRM_MOD(insn->modrm.value) > 2)
1168 return -EINVAL;
1169
1170 ret = insn_get_sib(insn);
1171 if (ret)
1172 return ret;
1173
1174 if (!insn->sib.nbytes)
1175 return -EINVAL;
1176
1177 *base_offset = get_reg_offset(insn, regs, REG_TYPE_BASE);
1178 indx_offset = get_reg_offset(insn, regs, REG_TYPE_INDEX);
1179
1180
1181
1182
1183
1184
1185 if (*base_offset == -EDOM)
1186 base = 0;
1187 else if (*base_offset < 0)
1188 return -EINVAL;
1189 else
1190 base = regs_get_register(regs, *base_offset);
1191
1192 if (indx_offset == -EDOM)
1193 indx = 0;
1194 else if (indx_offset < 0)
1195 return -EINVAL;
1196 else
1197 indx = regs_get_register(regs, indx_offset);
1198
1199 if (insn->addr_bytes == 4) {
1200 int addr32, base32, idx32;
1201
1202 base32 = base & 0xffffffff;
1203 idx32 = indx & 0xffffffff;
1204
1205 addr32 = base32 + idx32 * (1 << X86_SIB_SCALE(insn->sib.value));
1206 addr32 += insn->displacement.value;
1207
1208 *eff_addr = addr32 & 0xffffffff;
1209 } else {
1210 *eff_addr = base + indx * (1 << X86_SIB_SCALE(insn->sib.value));
1211 *eff_addr += insn->displacement.value;
1212 }
1213
1214 return 0;
1215 }
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234 static void __user *get_addr_ref_16(struct insn *insn, struct pt_regs *regs)
1235 {
1236 unsigned long linear_addr = -1L, seg_base, seg_limit;
1237 int ret, regoff;
1238 short eff_addr;
1239 long tmp;
1240
1241 if (insn_get_displacement(insn))
1242 goto out;
1243
1244 if (insn->addr_bytes != 2)
1245 goto out;
1246
1247 if (X86_MODRM_MOD(insn->modrm.value) == 3) {
1248 ret = get_eff_addr_reg(insn, regs, ®off, &tmp);
1249 if (ret)
1250 goto out;
1251
1252 eff_addr = tmp;
1253 } else {
1254 ret = get_eff_addr_modrm_16(insn, regs, ®off, &eff_addr);
1255 if (ret)
1256 goto out;
1257 }
1258
1259 ret = get_seg_base_limit(insn, regs, regoff, &seg_base, &seg_limit);
1260 if (ret)
1261 goto out;
1262
1263
1264
1265
1266
1267
1268
1269 if ((unsigned long)(eff_addr & 0xffff) > seg_limit)
1270 goto out;
1271
1272 linear_addr = (unsigned long)(eff_addr & 0xffff) + seg_base;
1273
1274
1275 if (v8086_mode(regs))
1276 linear_addr &= 0xfffff;
1277
1278 out:
1279 return (void __user *)linear_addr;
1280 }
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298 static void __user *get_addr_ref_32(struct insn *insn, struct pt_regs *regs)
1299 {
1300 unsigned long linear_addr = -1L, seg_base, seg_limit;
1301 int eff_addr, regoff;
1302 long tmp;
1303 int ret;
1304
1305 if (insn->addr_bytes != 4)
1306 goto out;
1307
1308 if (X86_MODRM_MOD(insn->modrm.value) == 3) {
1309 ret = get_eff_addr_reg(insn, regs, ®off, &tmp);
1310 if (ret)
1311 goto out;
1312
1313 eff_addr = tmp;
1314
1315 } else {
1316 if (insn->sib.nbytes) {
1317 ret = get_eff_addr_sib(insn, regs, ®off, &tmp);
1318 if (ret)
1319 goto out;
1320
1321 eff_addr = tmp;
1322 } else {
1323 ret = get_eff_addr_modrm(insn, regs, ®off, &tmp);
1324 if (ret)
1325 goto out;
1326
1327 eff_addr = tmp;
1328 }
1329 }
1330
1331 ret = get_seg_base_limit(insn, regs, regoff, &seg_base, &seg_limit);
1332 if (ret)
1333 goto out;
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346 if (!any_64bit_mode(regs) && ((unsigned int)eff_addr > seg_limit))
1347 goto out;
1348
1349
1350
1351
1352
1353 if (v8086_mode(regs) && (eff_addr & ~0xffff))
1354 goto out;
1355
1356
1357
1358
1359
1360
1361 linear_addr = (unsigned long)(eff_addr & 0xffffffff) + seg_base;
1362
1363
1364 if (v8086_mode(regs))
1365 linear_addr &= 0xfffff;
1366
1367 out:
1368 return (void __user *)linear_addr;
1369 }
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386 #ifndef CONFIG_X86_64
1387 static void __user *get_addr_ref_64(struct insn *insn, struct pt_regs *regs)
1388 {
1389 return (void __user *)-1L;
1390 }
1391 #else
1392 static void __user *get_addr_ref_64(struct insn *insn, struct pt_regs *regs)
1393 {
1394 unsigned long linear_addr = -1L, seg_base;
1395 int regoff, ret;
1396 long eff_addr;
1397
1398 if (insn->addr_bytes != 8)
1399 goto out;
1400
1401 if (X86_MODRM_MOD(insn->modrm.value) == 3) {
1402 ret = get_eff_addr_reg(insn, regs, ®off, &eff_addr);
1403 if (ret)
1404 goto out;
1405
1406 } else {
1407 if (insn->sib.nbytes) {
1408 ret = get_eff_addr_sib(insn, regs, ®off, &eff_addr);
1409 if (ret)
1410 goto out;
1411 } else {
1412 ret = get_eff_addr_modrm(insn, regs, ®off, &eff_addr);
1413 if (ret)
1414 goto out;
1415 }
1416
1417 }
1418
1419 ret = get_seg_base_limit(insn, regs, regoff, &seg_base, NULL);
1420 if (ret)
1421 goto out;
1422
1423 linear_addr = (unsigned long)eff_addr + seg_base;
1424
1425 out:
1426 return (void __user *)linear_addr;
1427 }
1428 #endif
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445 void __user *insn_get_addr_ref(struct insn *insn, struct pt_regs *regs)
1446 {
1447 if (!insn || !regs)
1448 return (void __user *)-1L;
1449
1450 if (insn_get_opcode(insn))
1451 return (void __user *)-1L;
1452
1453 switch (insn->addr_bytes) {
1454 case 2:
1455 return get_addr_ref_16(insn, regs);
1456 case 4:
1457 return get_addr_ref_32(insn, regs);
1458 case 8:
1459 return get_addr_ref_64(insn, regs);
1460 default:
1461 return (void __user *)-1L;
1462 }
1463 }
1464
1465 int insn_get_effective_ip(struct pt_regs *regs, unsigned long *ip)
1466 {
1467 unsigned long seg_base = 0;
1468
1469
1470
1471
1472
1473
1474
1475 if (!user_64bit_mode(regs)) {
1476 seg_base = insn_get_seg_base(regs, INAT_SEG_REG_CS);
1477 if (seg_base == -1L)
1478 return -EINVAL;
1479 }
1480
1481 *ip = seg_base + regs->ip;
1482
1483 return 0;
1484 }
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500 int insn_fetch_from_user(struct pt_regs *regs, unsigned char buf[MAX_INSN_SIZE])
1501 {
1502 unsigned long ip;
1503 int not_copied;
1504
1505 if (insn_get_effective_ip(regs, &ip))
1506 return -EINVAL;
1507
1508 not_copied = copy_from_user(buf, (void __user *)ip, MAX_INSN_SIZE);
1509
1510 return MAX_INSN_SIZE - not_copied;
1511 }
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528 int insn_fetch_from_user_inatomic(struct pt_regs *regs, unsigned char buf[MAX_INSN_SIZE])
1529 {
1530 unsigned long ip;
1531 int not_copied;
1532
1533 if (insn_get_effective_ip(regs, &ip))
1534 return -EINVAL;
1535
1536 not_copied = __copy_from_user_inatomic(buf, (void __user *)ip, MAX_INSN_SIZE);
1537
1538 return MAX_INSN_SIZE - not_copied;
1539 }
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555 bool insn_decode_from_regs(struct insn *insn, struct pt_regs *regs,
1556 unsigned char buf[MAX_INSN_SIZE], int buf_size)
1557 {
1558 int seg_defs;
1559
1560 insn_init(insn, buf, buf_size, user_64bit_mode(regs));
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572 seg_defs = insn_get_code_seg_params(regs);
1573 if (seg_defs == -EINVAL)
1574 return false;
1575
1576 insn->addr_bytes = INSN_CODE_SEG_ADDR_SZ(seg_defs);
1577 insn->opnd_bytes = INSN_CODE_SEG_OPND_SZ(seg_defs);
1578
1579 if (insn_get_length(insn))
1580 return false;
1581
1582 if (buf_size < insn->length)
1583 return false;
1584
1585 return true;
1586 }
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600 enum mmio_type insn_decode_mmio(struct insn *insn, int *bytes)
1601 {
1602 enum mmio_type type = MMIO_DECODE_FAILED;
1603
1604 *bytes = 0;
1605
1606 if (insn_get_opcode(insn))
1607 return MMIO_DECODE_FAILED;
1608
1609 switch (insn->opcode.bytes[0]) {
1610 case 0x88:
1611 *bytes = 1;
1612 fallthrough;
1613 case 0x89:
1614 if (!*bytes)
1615 *bytes = insn->opnd_bytes;
1616 type = MMIO_WRITE;
1617 break;
1618
1619 case 0xc6:
1620 *bytes = 1;
1621 fallthrough;
1622 case 0xc7:
1623 if (!*bytes)
1624 *bytes = insn->opnd_bytes;
1625 type = MMIO_WRITE_IMM;
1626 break;
1627
1628 case 0x8a:
1629 *bytes = 1;
1630 fallthrough;
1631 case 0x8b:
1632 if (!*bytes)
1633 *bytes = insn->opnd_bytes;
1634 type = MMIO_READ;
1635 break;
1636
1637 case 0xa4:
1638 *bytes = 1;
1639 fallthrough;
1640 case 0xa5:
1641 if (!*bytes)
1642 *bytes = insn->opnd_bytes;
1643 type = MMIO_MOVS;
1644 break;
1645
1646 case 0x0f:
1647 switch (insn->opcode.bytes[1]) {
1648 case 0xb6:
1649 *bytes = 1;
1650 fallthrough;
1651 case 0xb7:
1652 if (!*bytes)
1653 *bytes = 2;
1654 type = MMIO_READ_ZERO_EXTEND;
1655 break;
1656
1657 case 0xbe:
1658 *bytes = 1;
1659 fallthrough;
1660 case 0xbf:
1661 if (!*bytes)
1662 *bytes = 2;
1663 type = MMIO_READ_SIGN_EXTEND;
1664 break;
1665 }
1666 break;
1667 }
1668
1669 return type;
1670 }