4 #include <minix/callnr.h>
6 #include <minix/config.h>
7 #include <minix/const.h>
9 #include <minix/endpoint.h>
10 #include <minix/keymap.h>
11 #include <minix/minlib.h>
12 #include <minix/type.h>
13 #include <minix/ipc.h>
14 #include <minix/sysutil.h>
15 #include <minix/syslib.h>
16 #include <minix/bitmap.h>
29 /*===========================================================================*
31 *===========================================================================*/
32 PUBLIC vir_bytes
arch_map2vir(struct vmproc
*vmp
, vir_bytes addr
)
34 vir_bytes textstart
= CLICK2ABS(vmp
->vm_arch
.vm_seg
[T
].mem_phys
);
35 vir_bytes datastart
= CLICK2ABS(vmp
->vm_arch
.vm_seg
[D
].mem_phys
);
37 /* Could be a text address. */
38 vm_assert(datastart
<= addr
|| textstart
<= addr
);
40 return addr
- datastart
;
43 /*===========================================================================*
45 *===========================================================================*/
46 PUBLIC
char *arch_map2str(struct vmproc
*vmp
, vir_bytes addr
)
48 static char bufstr
[100];
49 vir_bytes textstart
= CLICK2ABS(vmp
->vm_arch
.vm_seg
[T
].mem_phys
);
50 vir_bytes textend
= textstart
+ CLICK2ABS(vmp
->vm_arch
.vm_seg
[T
].mem_len
);
51 vir_bytes datastart
= CLICK2ABS(vmp
->vm_arch
.vm_seg
[D
].mem_phys
);
53 if(addr
< textstart
) {
54 sprintf(bufstr
, "<lin:0x%lx>", addr
);
55 } else if(addr
< datastart
) {
56 sprintf(bufstr
, "0x%lx (codeseg)", addr
- textstart
);
58 sprintf(bufstr
, "0x%lx (dataseg)", addr
- datastart
);
64 /*===========================================================================*
66 *===========================================================================*/
67 PUBLIC vir_bytes
arch_map2info(struct vmproc
*vmp
, vir_bytes addr
, int *seg
,
70 vir_bytes textstart
= CLICK2ABS(vmp
->vm_arch
.vm_seg
[T
].mem_phys
);
71 vir_bytes textend
= textstart
+
72 CLICK2ABS(vmp
->vm_arch
.vm_seg
[T
].mem_len
);
73 vir_bytes datastart
= CLICK2ABS(vmp
->vm_arch
.vm_seg
[D
].mem_phys
);
75 /* The protection to be returned here is that of the segment. */
76 if(addr
< textstart
) {
78 *prot
= PROT_READ
| PROT_WRITE
| PROT_EXEC
;
80 } else if(addr
< datastart
) {
82 *prot
= PROT_READ
| PROT_EXEC
;
83 return addr
- textstart
;
86 if (textstart
== textend
) /* common I&D? */
87 *prot
= PROT_READ
| PROT_WRITE
| PROT_EXEC
;
89 *prot
= PROT_READ
| PROT_WRITE
;
90 return addr
- datastart
;
94 /*===========================================================================*
96 *===========================================================================*/
97 PUBLIC vir_bytes
arch_addrok(struct vmproc
*vmp
, vir_bytes addr
)
99 vir_bytes textstart
= CLICK2ABS(vmp
->vm_arch
.vm_seg
[T
].mem_phys
);
100 vir_bytes textend
= CLICK2ABS(vmp
->vm_arch
.vm_seg
[T
].mem_phys
+
101 vmp
->vm_arch
.vm_seg
[T
].mem_phys
);
102 vir_bytes datastart
= CLICK2ABS(vmp
->vm_arch
.vm_seg
[D
].mem_phys
);
104 if(addr
>= textstart
&& addr
< textstart
+textend
)
107 if(addr
>= datastart
&& addr
< VM_DATATOP
)
113 /*===========================================================================*
115 *===========================================================================*/
116 PUBLIC vir_bytes
arch_vir2map(struct vmproc
*vmp
, vir_bytes addr
)
118 vir_bytes bottom
= CLICK2ABS(vmp
->vm_arch
.vm_seg
[D
].mem_phys
);
120 return addr
+ bottom
;
123 /*===========================================================================*
124 * arch_vir2map_text *
125 *===========================================================================*/
126 PUBLIC vir_bytes
arch_vir2map_text(struct vmproc
*vmp
, vir_bytes addr
)
128 vir_bytes bottom
= CLICK2ABS(vmp
->vm_arch
.vm_seg
[T
].mem_phys
);
130 return addr
+ bottom
;