summaryrefslogtreecommitdiffstats
path: root/src/sys/vfs/vfs_init.C
diff options
context:
space:
mode:
authorDoug Gilbert <dgilbert@us.ibm.com>2011-09-16 11:17:49 -0500
committerDouglas R. Gilbert <dgilbert@us.ibm.com>2011-09-21 13:01:44 -0500
commitecbf21b783f33fc71f164540122179f6e011fa7b (patch)
treed62357801320649b9785b620f1dd87c5b49cbb93 /src/sys/vfs/vfs_init.C
parent4829bd486c7d36e61719cf39bde60f24bdc06f19 (diff)
downloadtalos-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/vfs_init.C')
-rw-r--r--src/sys/vfs/vfs_init.C51
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");
OpenPOWER on IntegriCloud