mirror of
https://github.com/drasko/codezero.git
synced 2026-02-20 05:43:15 +01:00
Removed non-standard allocation of mm0 utcb.
It is now allocated in a generic way using shm_new() which creates a posix shmat()/shmget()'able utcb.
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Initialise the system.
|
* Initialise the system.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007 Bahadir Balban
|
* Copyright (C) 2007, 2008 Bahadir Balban
|
||||||
*/
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -17,26 +17,6 @@
|
|||||||
#include <init.h>
|
#include <init.h>
|
||||||
#include <utcb.h>
|
#include <utcb.h>
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialise the utcb virtual address pool and its own utcb.
|
|
||||||
* NOTE: This allocates memory so kmalloc must be initialised first.
|
|
||||||
* FIXME: Is this necessary anymore??? Who maps mm0's page to share?
|
|
||||||
*/
|
|
||||||
void init_utcb_page(void)
|
|
||||||
{
|
|
||||||
void *utcb_virt, *utcb_phys;
|
|
||||||
|
|
||||||
/* Allocate and map one for self */
|
|
||||||
if (utcb_pool_init() < 0)
|
|
||||||
printf("UTCB initialisation failed.\n");
|
|
||||||
utcb_virt = utcb_vaddr_new();
|
|
||||||
printf("%s: Mapping 0x%x as utcb to self.\n", __TASKNAME__, utcb_virt);
|
|
||||||
utcb_phys = alloc_page(1);
|
|
||||||
l4_map(utcb_phys, utcb_virt, 1, MAP_USR_RW_FLAGS, self_tid());
|
|
||||||
|
|
||||||
/* Initialise the utcb page that is inside l4lib. */
|
|
||||||
utcb_page = utcb_virt;
|
|
||||||
}
|
|
||||||
|
|
||||||
void init_mm(struct initdata *initdata)
|
void init_mm(struct initdata *initdata)
|
||||||
{
|
{
|
||||||
@@ -63,8 +43,11 @@ void init_mm(struct initdata *initdata)
|
|||||||
shm_init();
|
shm_init();
|
||||||
printf("%s: Initialised shm structures.\n", __TASKNAME__);
|
printf("%s: Initialised shm structures.\n", __TASKNAME__);
|
||||||
|
|
||||||
init_utcb_page();
|
if (utcb_pool_init() < 0) {
|
||||||
printf("%s: Initialised mm0 utcb page.\n", __TASKNAME__);
|
printf("UTCB initialisation failed.\n");
|
||||||
|
BUG();
|
||||||
|
}
|
||||||
|
printf("%s: Initialised utcb address pool.\n", __TASKNAME__);
|
||||||
|
|
||||||
/* Give the kernel some memory to use for its allocators */
|
/* Give the kernel some memory to use for its allocators */
|
||||||
l4_kmem_grant(__pfn(alloc_page(__pfn(SZ_1MB))), __pfn(SZ_1MB));
|
l4_kmem_grant(__pfn(alloc_page(__pfn(SZ_1MB))), __pfn(SZ_1MB));
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ struct tcb *task_create(struct task_ids *ids)
|
|||||||
int task_mmap_regions(struct tcb *task, struct vm_file *file)
|
int task_mmap_regions(struct tcb *task, struct vm_file *file)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
struct vm_file *shm;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* mmap each task's physical image to task's address space.
|
* mmap each task's physical image to task's address space.
|
||||||
@@ -124,14 +125,19 @@ int task_mmap_regions(struct tcb *task, struct vm_file *file)
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Task's utcb */
|
||||||
|
task->utcb = utcb_vaddr_new();
|
||||||
|
|
||||||
|
/* Create a shared memory segment available for shmat() */
|
||||||
|
if (IS_ERR(shm = shm_new((key_t)task->utcb, __pfn(DEFAULT_UTCB_SIZE))))
|
||||||
|
return (int)shm;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int task_setup_regions(struct vm_file *file, struct tcb *task,
|
int task_setup_regions(struct vm_file *file, struct tcb *task,
|
||||||
unsigned long task_start, unsigned long task_end)
|
unsigned long task_start, unsigned long task_end)
|
||||||
{
|
{
|
||||||
struct vm_file *shm;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set task's main address space boundaries. Not all tasks
|
* Set task's main address space boundaries. Not all tasks
|
||||||
* run in the default user boundaries, e.g. mm0 pager.
|
* run in the default user boundaries, e.g. mm0 pager.
|
||||||
@@ -159,13 +165,6 @@ int task_setup_regions(struct vm_file *file, struct tcb *task,
|
|||||||
task->map_start = task->data_end;
|
task->map_start = task->data_end;
|
||||||
task->map_end = task->stack_start;
|
task->map_end = task->stack_start;
|
||||||
|
|
||||||
/* Task's utcb */
|
|
||||||
task->utcb = utcb_vaddr_new();
|
|
||||||
|
|
||||||
/* Create a shared memory segment available for shmat() */
|
|
||||||
if (IS_ERR(shm = shm_new((key_t)task->utcb, __pfn(DEFAULT_UTCB_SIZE))))
|
|
||||||
return (int)shm;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user