ret_val = 0;
child_dir = (pg_dir_t*)data;
- if(!(reg->reg_flags & REGION_PRIV)) {
- /* skip regions that are private to the parent */
-
- switch(reg->reg_type) {
- case REGION_TEXT:
- case REGION_RODATA:
- /* .text and .rodata are read-only, so we might as well just map them */
- ret_val = pg_dir_map_region(child_dir, parent_dir, reg);
- break;
-
- case REGION_BSS:
- case REGION_DATA:
- /* copy the region and its contents */
- ret_val = pg_dir_clone_region(child_dir, parent_dir, reg);
- break;
+ if(reg->reg_flags & (REGION_PRIV | REGION_KERNEL)) {
+ /* skip private and kernel regions */
+ goto skip;
+ }
- case REGION_KSTACK:
- case REGION_STACK:
- case REGION_HEAP:
- /* don't clone KSTACK/STACK/HEAP regions */
- default:
- break;
- }
+ switch(reg->reg_type) {
+ case REGION_TEXT:
+ case REGION_RODATA:
+ /* .text and .rodata are read-only, so we might as well just map them */
+ ret_val = pg_dir_map_region(child_dir, parent_dir, reg);
+ break;
+
+ case REGION_BSS:
+ case REGION_DATA:
+ /* copy the region and its contents */
+ ret_val = pg_dir_clone_region(child_dir, parent_dir, reg);
+ break;
+
+ case REGION_KSTACK:
+ case REGION_STACK:
+ case REGION_HEAP:
+ /* don't clone KSTACK/STACK/HEAP regions */
+ default:
+ break;
}
+skip:
return(ret_val);
}
ret_val = 0;
child_dir = (pg_dir_t*)data;
- if(!(reg->reg_flags & REGION_PRIV)) {
- /* skip private regions */
-
- switch(reg->reg_type) {
- case REGION_TEXT:
- case REGION_BSS:
- case REGION_DATA:
- case REGION_RODATA:
- /* directly map the region into the new page directory */
- ret_val = pg_dir_map_region(child_dir, parent_dir, reg);
- break;
+ if(reg->reg_flags & (REGION_PRIV | REGION_KERNEL)) {
+ /* skip private and kernel regions */
+ goto skip;
+ }
- case REGION_KSTACK:
- case REGION_STACK:
- case REGION_HEAP:
- /* don't map these */
- default:
- break;
- }
+ switch(reg->reg_type) {
+ case REGION_TEXT:
+ case REGION_BSS:
+ case REGION_DATA:
+ case REGION_RODATA:
+ /* directly map the region into the new page directory */
+ ret_val = pg_dir_map_region(child_dir, parent_dir, reg);
+ break;
+
+ case REGION_KSTACK:
+ case REGION_STACK:
+ case REGION_HEAP:
+ /* don't map these */
+ default:
+ break;
}
+skip:
return(ret_val);
}
process_t *cproc;
int ret_val;
+ /* FIXME: Add some sort of event-mask argument to process_wait() */
+
ret_val = -EFAULT;
cproc = process_get_current();