EFAULT - verify pages are in cache and are read/write, by Thayne Harbaugh.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3506 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
7c829863fb
commit
3d97b40b05
@ -691,6 +691,7 @@ void page_dump(FILE *f);
|
|||||||
int page_get_flags(target_ulong address);
|
int page_get_flags(target_ulong address);
|
||||||
void page_set_flags(target_ulong start, target_ulong end, int flags);
|
void page_set_flags(target_ulong start, target_ulong end, int flags);
|
||||||
void page_unprotect_range(target_ulong data, target_ulong data_size);
|
void page_unprotect_range(target_ulong data, target_ulong data_size);
|
||||||
|
int page_check_range(target_ulong start, target_ulong len, int flags);
|
||||||
|
|
||||||
CPUState *cpu_copy(CPUState *env);
|
CPUState *cpu_copy(CPUState *env);
|
||||||
|
|
||||||
|
27
exec.c
27
exec.c
@ -1875,6 +1875,33 @@ void page_set_flags(target_ulong start, target_ulong end, int flags)
|
|||||||
spin_unlock(&tb_lock);
|
spin_unlock(&tb_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int page_check_range(target_ulong start, target_ulong len, int flags)
|
||||||
|
{
|
||||||
|
PageDesc *p;
|
||||||
|
target_ulong end;
|
||||||
|
target_ulong addr;
|
||||||
|
|
||||||
|
end = TARGET_PAGE_ALIGN(start+len); /* must do before we loose bits in the next step */
|
||||||
|
start = start & TARGET_PAGE_MASK;
|
||||||
|
|
||||||
|
if( end < start )
|
||||||
|
/* we've wrapped around */
|
||||||
|
return -1;
|
||||||
|
for(addr = start; addr < end; addr += TARGET_PAGE_SIZE) {
|
||||||
|
p = page_find(addr >> TARGET_PAGE_BITS);
|
||||||
|
if( !p )
|
||||||
|
return -1;
|
||||||
|
if( !(p->flags & PAGE_VALID) )
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (!(p->flags & PAGE_READ) && (flags & PAGE_READ) )
|
||||||
|
return -1;
|
||||||
|
if (!(p->flags & PAGE_WRITE) && (flags & PAGE_WRITE) )
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* called from signal handler: invalidate the code and unprotect the
|
/* called from signal handler: invalidate the code and unprotect the
|
||||||
page. Return TRUE if the fault was succesfully handled. */
|
page. Return TRUE if the fault was succesfully handled. */
|
||||||
int page_unprotect(target_ulong address, unsigned long pc, void *puc)
|
int page_unprotect(target_ulong address, unsigned long pc, void *puc)
|
||||||
|
@ -203,7 +203,8 @@ int target_msync(abi_ulong start, abi_ulong len, int flags);
|
|||||||
#define VERIFY_READ 0
|
#define VERIFY_READ 0
|
||||||
#define VERIFY_WRITE 1
|
#define VERIFY_WRITE 1
|
||||||
|
|
||||||
#define access_ok(type,addr,size) (1)
|
#define access_ok(type,addr,size) \
|
||||||
|
(page_check_range((target_ulong)addr,size,(type==VERIFY_READ)?PAGE_READ:PAGE_WRITE)==0)
|
||||||
|
|
||||||
/* NOTE get_user and put_user use host addresses. */
|
/* NOTE get_user and put_user use host addresses. */
|
||||||
#define __put_user(x,ptr)\
|
#define __put_user(x,ptr)\
|
||||||
|
Loading…
Reference in New Issue
Block a user