int __kprobes arch_prepare_kprobe(struct kprobe *p)
 {
-       unsigned long probe_addr = (unsigned long)p->addr;
+       u16 *insn = (u16 *)p->addr;
 
-       if (probe_addr & 0x1)
+       if ((unsigned long)insn & 0x1)
                return -EILSEQ;
 
        if (!arch_check_kprobe(p))
                return -EILSEQ;
 
        /* copy instruction */
-       p->opcode = *p->addr;
+       p->opcode = (kprobe_opcode_t)(*insn++);
+       if (GET_INSN_LENGTH(p->opcode) == 4)
+               p->opcode |= (kprobe_opcode_t)(*insn) << 16;
 
        /* decode instruction */
        switch (riscv_probe_decode_insn(p->addr, &p->ainsn.api)) {