diff options
author | Doug Gilbert <dgilbert@us.ibm.com> | 2011-09-16 11:17:49 -0500 |
---|---|---|
committer | Douglas R. Gilbert <dgilbert@us.ibm.com> | 2011-09-21 13:01:44 -0500 |
commit | ecbf21b783f33fc71f164540122179f6e011fa7b (patch) | |
tree | d62357801320649b9785b620f1dd87c5b49cbb93 /src/sys/vfs | |
parent | 4829bd486c7d36e61719cf39bde60f24bdc06f19 (diff) | |
download | talos-hostboot-ecbf21b783f33fc71f164540122179f6e011fa7b.tar.gz talos-hostboot-ecbf21b783f33fc71f164540122179f6e011fa7b.zip |
VFS implement setting page permissions on virtual memory
Change-Id: I5a511a376d6d4ce685945e75aac7c550bb9e0aad
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/347
Tested-by: Jenkins Server
Reviewed-by: MATTHEW S. BARTH <msbarth@us.ibm.com>
Reviewed-by: Douglas R. Gilbert <dgilbert@us.ibm.com>
Diffstat (limited to 'src/sys/vfs')
-rw-r--r-- | src/sys/vfs/vfs_init.C | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/src/sys/vfs/vfs_init.C b/src/sys/vfs/vfs_init.C index e70243035..4c02ba141 100644 --- a/src/sys/vfs/vfs_init.C +++ b/src/sys/vfs/vfs_init.C @@ -26,10 +26,50 @@ */ #include <sys/vfs.h> #include <kernel/console.H> +#include <limits.h> +#include <sys/mm.h> VfsSystemModule VFS_MODULES[VFS_MODULE_MAX]; uint64_t VFS_LAST_ADDRESS; + +int vfs_module_perms(VfsSystemModule* module) +{ + int rc = 0; + uint64_t memsize = (module->page_size*PAGESIZE); + uint64_t textsize= (uint64_t)module->data - (uint64_t)module->text; + + uint64_t datasize = memsize - textsize; + + printkd("%s text=%lx:%lx data=%lx:%lx\n", + module->module, + module->text, + textsize, + module->data, + datasize); + + if(textsize != 0) + { + // Mark text pages(s) as executable + rc |= mm_set_permission(module->text, + textsize, + EXECUTABLE); + + // Mark data pages(s) as normal + rc |= mm_set_permission(module->data, + datasize, + WRITABLE); + } + else // ro data module + { + // Mark data pages(s) as normal + rc |= mm_set_permission(module->data, + datasize, + READ_ONLY); + } + return rc; +} + // ---------------------------------------------------------------------------- void vfs_module_init() @@ -39,12 +79,21 @@ void vfs_module_init() VfsSystemModule* module = &VFS_MODULES[0]; while ('\0' != module->module[0]) { + int rc = vfs_module_perms(module); + if(rc) printk("Perms set failed on %s, rc = %d\n", + module->module,rc); + ++module; + } + + module = &VFS_MODULES[0]; + while ('\0' != module->module[0]) + { printk("\tIniting module %s...", module->module); if (NULL != module->init) (module->init)(NULL); printk("done.\n"); - module++; + ++module; } printk("Modules initialized.\n"); |