mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
Fix __get_user() and friends to work correctly for
64-bit quantities on x86/32. Should fix writable pagetables on PAE. Signed-off-by: Keir Fraser <keir@xensource.com>
This commit is contained in:
1 parent
f26a97ed03
commit
df3de397c7
2 files changed
+14
-16
No files matched your search
+2
-2
@@ -3299,8 +3299,8 @@ int ptwr_do_page_fault(struct domain *d, unsigned long addr,
|
||||
|
||||
/* Finally, make the p.t. page writable by the guest OS. */
|
||||
l1e_add_flags(pte, _PAGE_RW);
|
||||
if ( unlikely(__copy_to_user(&linear_pg_table[l1_linear_offset(addr)],
|
||||
&pte, sizeof(pte))) )
|
||||
if ( unlikely(__put_user(pte.l1,
|
||||
&linear_pg_table[l1_linear_offset(addr)].l1)) )
|
||||
{
|
||||
MEM_LOG("ptwr: Could not update pte at %p", (unsigned long *)
|
||||
&linear_pg_table[l1_linear_offset(addr)]);
|
||||
|
||||
@@ -125,22 +125,20 @@ extern void __put_user_bad(void);
|
||||
__pu_err; \
|
||||
})
|
||||
|
||||
#define __get_user_nocheck(x,ptr,size) \
|
||||
({ \
|
||||
long __gu_err, __gu_val; \
|
||||
__get_user_size(__gu_val,(ptr),(size),__gu_err,-EFAULT);\
|
||||
(x) = (__typeof__(*(ptr)))__gu_val; \
|
||||
__gu_err; \
|
||||
#define __get_user_nocheck(x,ptr,size) \
|
||||
({ \
|
||||
long __gu_err; \
|
||||
__get_user_size((x),(ptr),(size),__gu_err,-EFAULT); \
|
||||
__gu_err; \
|
||||
})
|
||||
|
||||
#define __get_user_check(x,ptr,size) \
|
||||
({ \
|
||||
long __gu_err, __gu_val; \
|
||||
__typeof__(*(ptr)) __user *__gu_addr = (ptr); \
|
||||
__get_user_size(__gu_val,__gu_addr,(size),__gu_err,-EFAULT); \
|
||||
(x) = (__typeof__(*(ptr)))__gu_val; \
|
||||
if (!__addr_ok(__gu_addr)) __gu_err = -EFAULT; \
|
||||
__gu_err; \
|
||||
#define __get_user_check(x,ptr,size) \
|
||||
({ \
|
||||
long __gu_err; \
|
||||
__typeof__(*(ptr)) __user *__gu_addr = (ptr); \
|
||||
__get_user_size((x),__gu_addr,(size),__gu_err,-EFAULT); \
|
||||
if (!__addr_ok(__gu_addr)) __gu_err = -EFAULT; \
|
||||
__gu_err; \
|
||||
})
|
||||
|
||||
struct __large_struct { unsigned long buf[100]; };
|
||||
|
||||