mirror of
https://github.com/drasko/codezero.git
synced 2026-02-06 06:53:18 +01:00
Bugfixes, enhancements
- Fixed an important bug with shadow object handling. When a shadow is dropped, if there are references left to it, both the object in front and dropped object becomes a shadow of the original object underneath. We had thought of this case but had not increase the shadow count. - Added a test mechanism that tests the number of objects, vmfiles, shadows etc. by first counting them and trying to reach the same number by other means, i.e. per-object-shadow counts. It discovered a plethora of bugs. - Added new set of functions to register objects, files and tasks globally with the pager, these functions introduce a refcount as well as adding structures to linked lists. - fork/exit now seems to work stably i.e. no negative shadow counts etc.
This commit is contained in:
13
tasks/mm0/include/globals.h
Normal file
13
tasks/mm0/include/globals.h
Normal file
@@ -0,0 +1,13 @@
|
||||
#ifndef __GLOBALS_H__
|
||||
#define __GLOBALS_H__
|
||||
|
||||
struct global_list {
|
||||
int total;
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
extern struct global_list global_vm_files;
|
||||
extern struct global_list global_vm_objects;
|
||||
extern struct global_list global_tasks;
|
||||
|
||||
#endif /* __GLOBALS_H__ */
|
||||
@@ -111,8 +111,14 @@ struct task_data_head {
|
||||
struct task_data tdata[];
|
||||
};
|
||||
|
||||
struct tcb_head {
|
||||
struct list_head list;
|
||||
int total; /* Total threads */
|
||||
};
|
||||
|
||||
struct tcb *find_task(int tid);
|
||||
void task_add_global(struct tcb *t);
|
||||
void global_add_task(struct tcb *task);
|
||||
void global_remove_task(struct tcb *task);
|
||||
int send_task_data(struct tcb *requester);
|
||||
void task_map_prefault_utcb(struct tcb *mapper, struct tcb *owner);
|
||||
int task_mmap_regions(struct tcb *task, struct vm_file *file);
|
||||
@@ -122,8 +128,8 @@ int task_setup_registers(struct tcb *task, unsigned int pc,
|
||||
unsigned int sp, l4id_t pager);
|
||||
struct tcb *tcb_alloc_init(unsigned int flags);
|
||||
int tcb_destroy(struct tcb *task);
|
||||
int task_exec(struct vm_file *f, unsigned long task_region_start,
|
||||
unsigned long task_region_end, struct task_ids *ids);
|
||||
struct tcb *task_exec(struct vm_file *f, unsigned long task_region_start,
|
||||
unsigned long task_region_end, struct task_ids *ids);
|
||||
int task_start(struct tcb *task, struct task_ids *ids);
|
||||
int copy_tcb(struct tcb *to, struct tcb *from, unsigned int flags);
|
||||
int task_release_vmas(struct task_vma_head *vma_head);
|
||||
|
||||
7
tasks/mm0/include/test.h
Normal file
7
tasks/mm0/include/test.h
Normal file
@@ -0,0 +1,7 @@
|
||||
#ifndef __TEST_H__
|
||||
#define __TEST_H__
|
||||
|
||||
|
||||
int mm0_test_global_vm_integrity(void);
|
||||
|
||||
#endif /* __TEST_H__ */
|
||||
@@ -223,7 +223,8 @@ struct vm_file *vm_file_create(void);
|
||||
int vm_file_delete(struct vm_file *f);
|
||||
int vm_object_delete(struct vm_object *vmo);
|
||||
void vm_object_print(struct vm_object *vmo);
|
||||
void vm_object_print1(struct vm_object *vmo);
|
||||
void vm_print_objects(struct list_head *vmo_list);
|
||||
void vm_print_files(struct list_head *file_list);
|
||||
|
||||
/* Used for pre-faulting a page from mm0 */
|
||||
int prefault_page(struct tcb *task, unsigned long address,
|
||||
@@ -249,4 +250,9 @@ int page_fault_handler(struct tcb *faulty_task, fault_kdata_t *fkdata);
|
||||
int vma_drop_merge_delete(struct vm_area *vma, struct vm_obj_link *link);
|
||||
int vma_drop_merge_delete_all(struct vm_area *vma);
|
||||
|
||||
void global_add_vm_object(struct vm_object *obj);
|
||||
void global_remove_vm_object(struct vm_object *obj);
|
||||
void global_add_vm_file(struct vm_file *f);
|
||||
void global_remove_vm_file(struct vm_file *f);
|
||||
|
||||
#endif /* __VM_AREA_H__ */
|
||||
|
||||
Reference in New Issue
Block a user