Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8ed31300 authored by Rusty Russell's avatar Rusty Russell
Browse files

lguest: add infrastructure for userspace to deliver a trap to the guest.



This is required for instruction emulation to move to userspace.

Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent 69a09dc1
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -243,6 +243,23 @@ static int user_send_irq(struct lg_cpu *cpu, const unsigned long __user *input)
	return 0;
}

/*L:053
 * Deliver a trap: this is used by the Launcher if it can't emulate
 * an instruction.
 */
static int trap(struct lg_cpu *cpu, const unsigned long __user *input)
{
	unsigned long trapnum;

	if (get_user(trapnum, input) != 0)
		return -EFAULT;

	if (!deliver_trap(cpu, trapnum))
		return -EINVAL;

	return 0;
}

/*L:040
 * Once our Guest is initialized, the Launcher makes it run by reading
 * from /dev/lguest.
@@ -487,6 +504,8 @@ static ssize_t write(struct file *file, const char __user *in,
		return getreg_setup(cpu, input);
	case LHREQ_SETREG:
		return setreg(cpu, input);
	case LHREQ_TRAP:
		return trap(cpu, input);
	default:
		return -EINVAL;
	}
+1 −0
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ enum lguest_req
	LHREQ_EVENTFD, /* + address, fd. */
	LHREQ_GETREG, /* + offset within struct pt_regs (then read value). */
	LHREQ_SETREG, /* + offset within struct pt_regs, value. */
	LHREQ_TRAP, /* + trap number to deliver to guest. */
};

/*