Exemple #1
0
uint8_t
dtrace_fuword8(void *uaddr)
{
	if ((uintptr_t)uaddr >= (uintptr_t)MM_HIGHEST_USER_ADDRESS || 
	    (uintptr_t)uaddr <= (uintptr_t) MM_LOWEST_USER_ADDRESS ||
	    MmIsAddressValid((PVOID) uaddr) == 0) {
		DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR);
		cpu_core[KeGetCurrentProcessorNumber()].cpuc_dtrace_illval = (uintptr_t)uaddr;
		return (0);
	}
	return (dtrace_fuword8_nocheck(uaddr));
}
Exemple #2
0
static int
dtrace_copycheck(uintptr_t uaddr, uintptr_t kaddr, size_t size)
{

    if (dtrace_here) {
        printk("copycheck: uaddr=%p kaddr=%p size=%d\n", (void *) uaddr, (void*) kaddr, (int) size);
    }
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31)
    if (__range_not_ok(uaddr, size)) {
#else
    if (!addr_valid(uaddr) || !addr_valid(uaddr + size)) {
#endif
//printk("uaddr=%p size=%d\n", uaddr, size);
        DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR);
        cpu_core[cpu_get_id()].cpuc_dtrace_illval = uaddr;
        return (0);
    }
    return (1);
}
# endif

void
dtrace_copyin(uintptr_t uaddr, uintptr_t kaddr, size_t size,
              volatile uint16_t *flags)
{
    if (dtrace_memcpy_with_error((void *) kaddr, (void *) uaddr, size) == 0) {
        DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR);
        return;
    }
}

void
dtrace_copyout(uintptr_t kaddr, uintptr_t uaddr, size_t size,
               volatile uint16_t *flags)
{
    if (dtrace_memcpy_with_error((void *) uaddr, (void *) kaddr, size) == 0) {
        DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR);
        return;
    }
}

void
dtrace_copyinstr(uintptr_t uaddr, uintptr_t kaddr, size_t size,
                 volatile uint16_t *flags)
{
    if (dtrace_memcpy_with_error((void *) kaddr, (void *) uaddr, size) == 0) {
        DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR);
        return;
    }
}

void
dtrace_copyoutstr(uintptr_t kaddr, uintptr_t uaddr, size_t size,
                  volatile uint16_t *flags)
{
    if (dtrace_memcpy_with_error((void *) kaddr, (void *) uaddr, size) == 0) {
        DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR);
        return;
    }
}

uint8_t
dtrace_fuword8(void *uaddr)
{
    extern uint8_t dtrace_fuword8_nocheck(void *);
    if (!access_ok(VERIFY_READ, uaddr, 1)) {
        DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR);
        printk("dtrace_fuword8: uaddr=%p CPU_DTRACE_BADADDR\n", uaddr);
        cpu_core[cpu_get_id()].cpuc_dtrace_illval = (uintptr_t)uaddr;
        return (0);
    }
    return (dtrace_fuword8_nocheck(uaddr));
}

uint16_t
dtrace_fuword16(void *uaddr)
{
    extern uint16_t dtrace_fuword16_nocheck(void *);
    if (!access_ok(VERIFY_WRITE, uaddr, 2)) {
        printk("dtrace_fuword16: uaddr=%p CPU_DTRACE_BADADDR\n", uaddr);
        DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR);
        cpu_core[cpu_get_id()].cpuc_dtrace_illval = (uintptr_t)uaddr;
        return (0);
    }
    return (dtrace_fuword16_nocheck(uaddr));
}

uint32_t
dtrace_fuword32(void *uaddr)
{
    extern uint32_t dtrace_fuword32_nocheck(void *);
    if (!addr_valid(uaddr)) {
        HERE2();
        DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR);
        cpu_core[cpu_get_id()].cpuc_dtrace_illval = (uintptr_t)uaddr;
        return (0);
    }
    return (dtrace_fuword32_nocheck(uaddr));
}

uint64_t
dtrace_fuword64(void *uaddr)
{
    extern uint64_t dtrace_fuword64_nocheck(void *);
    if (!addr_valid(uaddr)) {
        HERE2();
        DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR);
        cpu_core[cpu_get_id()].cpuc_dtrace_illval = (uintptr_t)uaddr;
        return (0);
    }
    return (dtrace_fuword64_nocheck(uaddr));
}