mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86/pv32: Fix bogus CR2 in pagefault for gate emulation
__{put,get}_guest() returns -EFAULT on access faults which causes
the injected CR2 to be off by 14 bytes (as EFAULT is 14) which is
incorrect.
Fix the computation by relying on __copy_{from,to}_guest_pv() which
reports the number of remaining bytes instead of a negative errno,
such that we can compute the offset properly.
Fixes: 70ad570b27 ("x86/64: paravirt 32-on-64 call gate support")
Signed-off-by: Teddy Astie <teddy.astie@vates.tech>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
c0e548d920
commit
03878fba4a
1 file changed
+4
-2
@@ -286,12 +286,14 @@ void pv_emulate_gate_op(struct cpu_user_regs *regs)
|
||||
if ( !jump )
|
||||
{
|
||||
unsigned int ss, esp, *stkp;
|
||||
uint32_t value;
|
||||
int rc;
|
||||
#define push(item) do \
|
||||
{ \
|
||||
value = (item); \
|
||||
--stkp; \
|
||||
esp -= 4; \
|
||||
rc = __put_guest(item, stkp); \
|
||||
rc = __copy_to_guest_pv(stkp, &value, sizeof(value)); \
|
||||
if ( rc ) \
|
||||
{ \
|
||||
pv_inject_page_fault(PFEC_write_access, \
|
||||
@@ -359,7 +361,7 @@ void pv_emulate_gate_op(struct cpu_user_regs *regs)
|
||||
unsigned int parm;
|
||||
|
||||
--ustkp;
|
||||
rc = __get_guest(parm, ustkp);
|
||||
rc = __copy_from_guest_pv(&parm, ustkp, sizeof(parm));
|
||||
if ( rc )
|
||||
{
|
||||
pv_inject_page_fault(0, (unsigned long)(ustkp + 1) - rc);
|
||||
|
||||