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>
30 /*===========================================================================*
32 *===========================================================================*/
33 PUBLIC vir_bytes
arch_map2vir(struct vmproc
*vmp
, vir_bytes addr
)
35 vir_bytes textstart
= CLICK2ABS(vmp
->vm_arch
.vm_seg
[T
].mem_phys
);
36 vir_bytes datastart
= CLICK2ABS(vmp
->vm_arch
.vm_seg
[D
].mem_phys
);
38 /* Could be a text address. */
39 assert(datastart
<= addr
|| textstart
<= addr
);
41 return addr
- datastart
;
44 /*===========================================================================*
46 *===========================================================================*/
47 PUBLIC
char *arch_map2str(struct vmproc
*vmp
, vir_bytes addr
)
49 static char bufstr
[100];
50 vir_bytes textstart
= CLICK2ABS(vmp
->vm_arch
.vm_seg
[T
].mem_phys
);
51 vir_bytes textend
= textstart
+ CLICK2ABS(vmp
->vm_arch
.vm_seg
[T
].mem_len
);
52 vir_bytes datastart
= CLICK2ABS(vmp
->vm_arch
.vm_seg
[D
].mem_phys
);
54 if(addr
< textstart
) {
55 sprintf(bufstr
, "<lin:0x%lx>", addr
);
56 } else if(addr
< datastart
) {
57 sprintf(bufstr
, "0x%lx (codeseg)", addr
- textstart
);
59 sprintf(bufstr
, "0x%lx (dataseg)", addr
- datastart
);
65 /*===========================================================================*
67 *===========================================================================*/
68 PUBLIC vir_bytes
arch_map2info(struct vmproc
*vmp
, vir_bytes addr
, int *seg
,
71 vir_bytes textstart
= CLICK2ABS(vmp
->vm_arch
.vm_seg
[T
].mem_phys
);
72 vir_bytes textend
= textstart
+
73 CLICK2ABS(vmp
->vm_arch
.vm_seg
[T
].mem_len
);
74 vir_bytes datastart
= CLICK2ABS(vmp
->vm_arch
.vm_seg
[D
].mem_phys
);
76 /* The protection to be returned here is that of the segment. */
77 if(addr
< textstart
) {
79 *prot
= PROT_READ
| PROT_WRITE
| PROT_EXEC
;
81 } else if(addr
< datastart
) {
83 *prot
= PROT_READ
| PROT_EXEC
;
84 return addr
- textstart
;
87 if (textstart
== textend
) /* common I&D? */
88 *prot
= PROT_READ
| PROT_WRITE
| PROT_EXEC
;
90 *prot
= PROT_READ
| PROT_WRITE
;
91 return addr
- datastart
;
95 /*===========================================================================*
97 *===========================================================================*/
98 PUBLIC vir_bytes
arch_addrok(struct vmproc
*vmp
, vir_bytes addr
)
100 vir_bytes textstart
= CLICK2ABS(vmp
->vm_arch
.vm_seg
[T
].mem_phys
);
101 vir_bytes textend
= CLICK2ABS(vmp
->vm_arch
.vm_seg
[T
].mem_phys
+
102 vmp
->vm_arch
.vm_seg
[T
].mem_phys
);
103 vir_bytes datastart
= CLICK2ABS(vmp
->vm_arch
.vm_seg
[D
].mem_phys
);
105 if(addr
>= textstart
&& addr
< textstart
+textend
)
108 if(addr
>= datastart
&& addr
< VM_DATATOP
)
114 /*===========================================================================*
116 *===========================================================================*/
117 PUBLIC vir_bytes
arch_vir2map(struct vmproc
*vmp
, vir_bytes addr
)
119 vir_bytes bottom
= CLICK2ABS(vmp
->vm_arch
.vm_seg
[D
].mem_phys
);
121 return addr
+ bottom
;
124 /*===========================================================================*
125 * arch_vir2map_text *
126 *===========================================================================*/
127 PUBLIC vir_bytes
arch_vir2map_text(struct vmproc
*vmp
, vir_bytes addr
)
129 vir_bytes bottom
= CLICK2ABS(vmp
->vm_arch
.vm_seg
[T
].mem_phys
);
131 return addr
+ bottom
;