| 1 | /* The kernel call implemented in this file: | 
|---|
| 2 | *   m_type:    SYS_NEWMAP | 
|---|
| 3 | * | 
|---|
| 4 | * The parameters for this kernel call are: | 
|---|
| 5 | *    m1_i1:    PR_ENDPT                (install new map for this process) | 
|---|
| 6 | *    m1_p1:    PR_MEM_PTR              (pointer to the new memory map) | 
|---|
| 7 | */ | 
|---|
| 8 | #include "../system.h" | 
|---|
| 9 | #include <minix/endpoint.h> | 
|---|
| 10 |  | 
|---|
| 11 | #if USE_NEWMAP | 
|---|
| 12 |  | 
|---|
| 13 | /*===========================================================================* | 
|---|
| 14 | *                              do_newmap                                    * | 
|---|
| 15 | *===========================================================================*/ | 
|---|
| 16 | PUBLIC int do_newmap(m_ptr) | 
|---|
| 17 | message *m_ptr;                 /* pointer to request message */ | 
|---|
| 18 | { | 
|---|
| 19 | /* Handle sys_newmap().  Fetch the memory map from PM. */ | 
|---|
| 20 | register struct proc *rp;     /* process whose map is to be loaded */ | 
|---|
| 21 | struct mem_map *map_ptr;      /* virtual address of map inside caller (PM) */ | 
|---|
| 22 | phys_bytes src_phys;          /* physical address of map at the PM */ | 
|---|
| 23 | int old_flags;                /* value of flags before modification */ | 
|---|
| 24 | int proc; | 
|---|
| 25 |  | 
|---|
| 26 | map_ptr = (struct mem_map *) m_ptr->PR_MEM_PTR; | 
|---|
| 27 | if (! isokendpt(m_ptr->PR_ENDPT, &proc)) return(EINVAL); | 
|---|
| 28 | if (iskerneln(proc)) return(EPERM); | 
|---|
| 29 | rp = proc_addr(proc); | 
|---|
| 30 |  | 
|---|
| 31 | /* Copy the map from PM. */ | 
|---|
| 32 | src_phys = umap_local(proc_addr(who_p), D, (vir_bytes) map_ptr, | 
|---|
| 33 | sizeof(rp->p_memmap)); | 
|---|
| 34 | if (src_phys == 0) return(EFAULT); | 
|---|
| 35 | phys_copy(src_phys,vir2phys(rp->p_memmap),(phys_bytes)sizeof(rp->p_memmap)); | 
|---|
| 36 |  | 
|---|
| 37 | #if (CHIP != M68000) | 
|---|
| 38 | alloc_segments(rp); | 
|---|
| 39 | #else | 
|---|
| 40 | pmmu_init_proc(rp); | 
|---|
| 41 | #endif | 
|---|
| 42 | old_flags = rp->p_rts_flags;  /* save the previous value of the flags */ | 
|---|
| 43 | rp->p_rts_flags &= ~NO_MAP; | 
|---|
| 44 | if (old_flags != 0 && rp->p_rts_flags == 0) lock_enqueue(rp); | 
|---|
| 45 |  | 
|---|
| 46 | return(OK); | 
|---|
| 47 | } | 
|---|
| 48 | #endif /* USE_NEWMAP */ | 
|---|
| 49 |  | 
|---|