]> git.corax.cc Git - corax/commitdiff
Ensure that PAGE_ATTR_USER is set and PAGE_ATTR_WRITABLE is not set on kernel code...
authorMatthias Kruk <m@m10k.eu>
Wed, 25 Sep 2019 08:07:03 +0000 (17:07 +0900)
committerMatthias Kruk <m@m10k.eu>
Wed, 25 Sep 2019 08:07:03 +0000 (17:07 +0900)
kernel/arch/paging.c

index d7ff02e7ed674ceb90ec469ac5191ad9ff210708..7f5a6242c48c1c604b83ee16bcb042cf562cab26 100644 (file)
@@ -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;