From: Matthias Kruk Date: Wed, 25 Sep 2019 08:07:03 +0000 (+0900) Subject: Ensure that PAGE_ATTR_USER is set and PAGE_ATTR_WRITABLE is not set on kernel code... X-Git-Url: https://git.corax.cc/?a=commitdiff_plain;h=3b9d9a644c79b8d8e88684b72f1725914904ce71;p=corax Ensure that PAGE_ATTR_USER is set and PAGE_ATTR_WRITABLE is not set on kernel code/data segments in user-space page directories --- diff --git a/kernel/arch/paging.c b/kernel/arch/paging.c index d7ff02e..7f5a624 100644 --- a/kernel/arch/paging.c +++ b/kernel/arch/paging.c @@ -620,21 +620,26 @@ int pg_dir_create(pg_dir_t **dst) * with speculative execution behavior of certain processors */ for(reg = _kernel_pgdir.pd_regions; reg; reg = reg->reg_next) { + u32_t attrs; + switch(reg->reg_type) { case REGION_TEXT: case REGION_BSS: case REGION_DATA: case REGION_RODATA: case REGION_HEAP: - dbg_printf("Mapping region %02x at 0x%08x:%08x\n", - reg->reg_type, reg->reg_base, reg->reg_size); + /* make sure PAGE_ATTR_USER is set and PAGE_ATTR_WRITABLE is not set */ + attrs = (reg->reg_attrs | PAGE_ATTR_USER) & ~PAGE_ATTR_WRITABLE; + + dbg_printf("Mapping region %02x at 0x%08x:%08x (ATTR=%x)\n", + reg->reg_type, reg->reg_base, reg->reg_size, attrs); ret_val = pg_dir_map(dir, reg->reg_base, reg->reg_base, - reg->reg_size, reg->reg_attrs); + reg->reg_size, attrs); if(ret_val >= 0) { ret_val = _pg_dir_add_region(dir, reg->reg_base, reg->reg_size, - reg->reg_type, reg->reg_attrs); + reg->reg_type, attrs); } break;