/** * @brief Checks access permissions to a memory area. * * @param addr Address to be checked. * @param size Size of memory area. * @param mask Access permissions mask. * * @returns Non-zero if access is authorized, and zero otherwise. */ PUBLIC int chkmem(const void *addr, size_t size, mode_t mask) { int ret; /* Return value. */ struct region *reg; /* Working memory region. */ struct pregion *preg; /* Working process region. */ /* Get associated process memory region. */ if ((preg = findreg(curr_proc, ADDR(addr))) == NULL) return (-1); lockreg(reg = preg->reg); /* Not allowed. */ if (!(accessreg(curr_proc, reg) & mask)) { unlockreg(reg); return (-1); } ret = withinreg(preg, ADDR(addr)); ret &= withinreg(preg, ADDR(addr) + size); unlockreg(reg); return (ret); }
void storereg(context* ctx, assembly* casm, qoperand* q, int reg, int local, int temp) { accessreg(ctx, casm, 1, q, reg, local, temp); }