summaryrefslogtreecommitdiffstats
path: root/src/sys/vfs
diff options
context:
space:
mode:
Diffstat (limited to 'src/sys/vfs')
-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