Lines 1-20
Link Here
|
1 |
Index: qemu/kqemu/Makefile.freebsd |
1 |
Index: qemu/kqemu/Makefile.freebsd |
2 |
@@ -1,9 +1,13 @@ |
2 |
@@ -5,6 +5,7 @@ |
3 |
+# $Id: Makefile.freebsd,v 1.1 2005/04/17 17:21:31 bellard Exp $ |
|
|
4 |
KMOD= kqemu |
5 |
SRCS= kqemu-freebsd.c |
6 |
.if ${MACHINE_ARCH} == "i386" |
7 |
OBJS= kqemu-mod-i386.o |
8 |
.elif ${MACHINE_ARCH} == "amd64" |
3 |
.elif ${MACHINE_ARCH} == "amd64" |
9 |
OBJS= kqemu-mod-x86_64.o |
4 |
OBJS= kqemu-mod-x86_64.o |
10 |
+.endif |
|
|
11 |
+.if ${OSVERSION} >= 500000 |
12 |
+CC= cc |
13 |
.endif |
5 |
.endif |
|
|
6 |
+CC= cc |
14 |
WERROR= |
7 |
WERROR= |
15 |
|
8 |
|
|
|
9 |
.include <bsd.kmod.mk> |
16 |
Index: qemu/kqemu/kqemu-freebsd.c |
10 |
Index: qemu/kqemu/kqemu-freebsd.c |
17 |
@@ -3,20 +3,33 @@ |
11 |
@@ -3,32 +3,55 @@ |
18 |
#include <sys/param.h> |
12 |
#include <sys/param.h> |
19 |
#include <sys/systm.h> |
13 |
#include <sys/systm.h> |
20 |
#include <sys/conf.h> |
14 |
#include <sys/conf.h> |
Lines 23-29
Link Here
|
23 |
#include <sys/ioccom.h> |
17 |
#include <sys/ioccom.h> |
24 |
#include <sys/malloc.h> |
18 |
#include <sys/malloc.h> |
25 |
#include <sys/module.h> |
19 |
#include <sys/module.h> |
|
|
20 |
+#if __FreeBSD_version >= 500000 |
26 |
#include <sys/mutex.h> |
21 |
#include <sys/mutex.h> |
|
|
22 |
+#endif |
27 |
#include <sys/proc.h> |
23 |
#include <sys/proc.h> |
28 |
+#include <sys/resourcevar.h> |
24 |
+#include <sys/resourcevar.h> |
29 |
+#if __FreeBSD_version >= 500000 |
25 |
+#if __FreeBSD_version >= 500000 |
Lines 48-54
Link Here
|
48 |
#include <machine/vmparam.h> |
44 |
#include <machine/vmparam.h> |
49 |
#include <machine/stdarg.h> |
45 |
#include <machine/stdarg.h> |
50 |
|
46 |
|
51 |
@@ -25,10 +38,14 @@ |
47 |
#include "kqemu-kernel.h" |
|
|
48 |
|
49 |
+#ifndef KQEMU_MAJOR |
50 |
+#define KQEMU_MAJOR 250 |
51 |
+#endif |
52 |
+ |
52 |
MALLOC_DECLARE(M_KQEMU); |
53 |
MALLOC_DECLARE(M_KQEMU); |
53 |
MALLOC_DEFINE(M_KQEMU, "kqemu", "kqemu buffers"); |
54 |
MALLOC_DEFINE(M_KQEMU, "kqemu", "kqemu buffers"); |
54 |
|
55 |
|
Lines 64-70
Link Here
|
64 |
struct kqemu_user_page *CDECL kqemu_lock_user_page(unsigned long *ppage_index, |
65 |
struct kqemu_user_page *CDECL kqemu_lock_user_page(unsigned long *ppage_index, |
65 |
unsigned long user_addr) |
66 |
unsigned long user_addr) |
66 |
{ |
67 |
{ |
67 |
@@ -37,14 +54,18 @@ |
68 |
@@ -37,14 +60,18 @@ |
68 |
vm_paddr_t pa = 0; |
69 |
vm_paddr_t pa = 0; |
69 |
int ret; |
70 |
int ret; |
70 |
pmap_t pmap; |
71 |
pmap_t pmap; |
Lines 81-96
Link Here
|
81 |
pmap = vm_map_pmap(&vm->vm_map); |
82 |
pmap = vm_map_pmap(&vm->vm_map); |
82 |
pa = pmap_extract(pmap, va); |
83 |
pa = pmap_extract(pmap, va); |
83 |
- // printf("kqemu_lock_user_page(%08lx) va=%08x pa=%08x\n", user_addr, va, pa); |
84 |
- // printf("kqemu_lock_user_page(%08lx) va=%08x pa=%08x\n", user_addr, va, pa); |
84 |
+ // kqemu_log("kqemu_lock_user_page(%08lx) va=%08x pa=%08x\n", user_addr, va, pa); |
85 |
+ /* kqemu_log("kqemu_lock_user_page(%08lx) va=%08x pa=%08x\n", user_addr, va, pa); */ |
85 |
*ppage_index = pa >> PAGE_SHIFT; |
86 |
*ppage_index = pa >> PAGE_SHIFT; |
86 |
return (struct kqemu_user_page *)va; |
87 |
return (struct kqemu_user_page *)va; |
87 |
} |
88 |
} |
88 |
@@ -54,12 +75,16 @@ |
89 |
@@ -54,12 +81,16 @@ |
89 |
struct vmspace *vm = curproc->p_vmspace; |
90 |
struct vmspace *vm = curproc->p_vmspace; |
90 |
vm_offset_t va; |
91 |
vm_offset_t va; |
91 |
int ret; |
92 |
int ret; |
92 |
- // printf("kqemu_unlock_user_page(%08lx)\n", page_index); |
93 |
- // printf("kqemu_unlock_user_page(%08lx)\n", page_index); |
93 |
+ // kqemu_log("kqemu_unlock_user_page(%08lx)\n", page_index); |
94 |
+ /* kqemu_log("kqemu_unlock_user_page(%08lx)\n", page_index); */ |
94 |
va = (vm_offset_t)page; |
95 |
va = (vm_offset_t)page; |
95 |
+#if __FreeBSD_version >= 500000 |
96 |
+#if __FreeBSD_version >= 500000 |
96 |
ret = vm_map_unwire(&vm->vm_map, va, va+PAGE_SIZE, VM_MAP_WIRE_USER); |
97 |
ret = vm_map_unwire(&vm->vm_map, va, va+PAGE_SIZE, VM_MAP_WIRE_USER); |
Lines 104-110
Link Here
|
104 |
} |
105 |
} |
105 |
#endif |
106 |
#endif |
106 |
} |
107 |
} |
107 |
@@ -76,20 +101,21 @@ |
108 |
@@ -76,20 +107,21 @@ |
108 |
|
109 |
|
109 |
va = kmem_alloc(kernel_map, PAGE_SIZE); |
110 |
va = kmem_alloc(kernel_map, PAGE_SIZE); |
110 |
if (va == 0) { |
111 |
if (va == 0) { |
Lines 116-122
Link Here
|
116 |
pmap = vm_map_pmap(kernel_map); |
117 |
pmap = vm_map_pmap(kernel_map); |
117 |
pa = pmap_extract(pmap, va); |
118 |
pa = pmap_extract(pmap, va); |
118 |
- // printf("kqemu_alloc_zeroed_page: %08x\n", pa); |
119 |
- // printf("kqemu_alloc_zeroed_page: %08x\n", pa); |
119 |
+ // kqemu_log("kqemu_alloc_zeroed_page: %08x\n", pa); |
120 |
+ /* kqemu_log("kqemu_alloc_zeroed_page: %08x\n", pa); */ |
120 |
*ppage_index = pa >> PAGE_SHIFT; |
121 |
*ppage_index = pa >> PAGE_SHIFT; |
121 |
return (struct kqemu_page *)va; |
122 |
return (struct kqemu_page *)va; |
122 |
} |
123 |
} |
Lines 131-137
Link Here
|
131 |
} |
132 |
} |
132 |
|
133 |
|
133 |
/* return kernel address of the physical page page_index */ |
134 |
/* return kernel address of the physical page page_index */ |
134 |
@@ -103,42 +129,29 @@ |
135 |
@@ -103,42 +135,29 @@ |
135 |
GB of physical memory */ |
136 |
GB of physical memory */ |
136 |
void * CDECL kqemu_vmalloc(unsigned int size) |
137 |
void * CDECL kqemu_vmalloc(unsigned int size) |
137 |
{ |
138 |
{ |
Lines 185-191
Link Here
|
185 |
return pa >> PAGE_SHIFT; |
186 |
return pa >> PAGE_SHIFT; |
186 |
} |
187 |
} |
187 |
|
188 |
|
188 |
@@ -154,16 +167,48 @@ |
189 |
@@ -154,16 +173,48 @@ |
189 |
{ |
190 |
{ |
190 |
} |
191 |
} |
191 |
|
192 |
|
Lines 204-214
Link Here
|
204 |
+ return ((int)p->p_rtprio.prio - (int)curproc->p_rtprio.prio); |
205 |
+ return ((int)p->p_rtprio.prio - (int)curproc->p_rtprio.prio); |
205 |
+} |
206 |
+} |
206 |
+ |
207 |
+ |
207 |
/* return TRUE if a signal is pending (i.e. the guest must stop |
208 |
+/* return TRUE if a signal is pending (i.e. the guest must stop |
208 |
execution) */ |
209 |
+ execution) */ |
209 |
int CDECL kqemu_schedule(void) |
210 |
+int CDECL kqemu_schedule(void) |
210 |
{ |
211 |
+{ |
211 |
- // printf("kqemu_schedule\n"); |
|
|
212 |
+ struct proc *p = curproc; |
212 |
+ struct proc *p = curproc; |
213 |
+ if (curpriority_cmp(p) > 0) { |
213 |
+ if (curpriority_cmp(p) > 0) { |
214 |
+ int s = splhigh(); |
214 |
+ int s = splhigh(); |
Lines 221-231
Link Here
|
221 |
+ return issignal(curproc) != 0; |
221 |
+ return issignal(curproc) != 0; |
222 |
+} |
222 |
+} |
223 |
+#else |
223 |
+#else |
224 |
+/* return TRUE if a signal is pending (i.e. the guest must stop |
224 |
/* return TRUE if a signal is pending (i.e. the guest must stop |
225 |
+ execution) */ |
225 |
execution) */ |
226 |
+int CDECL kqemu_schedule(void) |
226 |
int CDECL kqemu_schedule(void) |
227 |
+{ |
227 |
{ |
228 |
+ // kqemu_log("kqemu_schedule\n"); |
228 |
- // printf("kqemu_schedule\n"); |
|
|
229 |
+ /* kqemu_log("kqemu_schedule\n"); */ |
229 |
mtx_lock_spin(&sched_lock); |
230 |
mtx_lock_spin(&sched_lock); |
230 |
mi_switch(SW_VOL, NULL); |
231 |
mi_switch(SW_VOL, NULL); |
231 |
mtx_unlock_spin(&sched_lock); |
232 |
mtx_unlock_spin(&sched_lock); |
Lines 235-252
Link Here
|
235 |
|
236 |
|
236 |
static char log_buf[4096]; |
237 |
static char log_buf[4096]; |
237 |
|
238 |
|
238 |
@@ -176,47 +221,154 @@ |
239 |
@@ -176,47 +227,155 @@ |
239 |
va_end(ap); |
240 |
va_end(ap); |
240 |
} |
241 |
} |
241 |
|
242 |
|
242 |
+#define KQEMU_MAX_INSTANCES 4 |
243 |
+#define KQEMU_MAX_INSTANCES 4 |
243 |
+ |
244 |
+ |
244 |
struct kqemu_instance { |
245 |
struct kqemu_instance { |
|
|
246 |
- // struct semaphore sem; |
245 |
+#if __FreeBSD_version >= 500000 |
247 |
+#if __FreeBSD_version >= 500000 |
246 |
+ TAILQ_ENTRY(kqemu_instance) kqemu_ent; |
248 |
+ TAILQ_ENTRY(kqemu_instance) kqemu_ent; |
247 |
+ struct cdev *kqemu_dev; |
249 |
+ struct cdev *kqemu_dev; |
248 |
+#endif |
250 |
+#endif |
249 |
// struct semaphore sem; |
251 |
+ /* struct semaphore sem; */ |
250 |
struct kqemu_state *state; |
252 |
struct kqemu_state *state; |
251 |
}; |
253 |
}; |
252 |
|
254 |
|
Lines 318-324
Link Here
|
318 |
+ *dev = make_dev(&kqemu_cdevsw, unit2minor(unit), |
320 |
+ *dev = make_dev(&kqemu_cdevsw, unit2minor(unit), |
319 |
+ UID_ROOT, GID_WHEEL, 0660, "kqemu%d", unit); |
321 |
+ UID_ROOT, GID_WHEEL, 0660, "kqemu%d", unit); |
320 |
+ if (*dev != NULL) { |
322 |
+ if (*dev != NULL) { |
321 |
+ dev_ref(*dev); |
|
|
322 |
+ (*dev)->si_flags |= SI_CHEAPCLONE; |
323 |
+ (*dev)->si_flags |= SI_CHEAPCLONE; |
323 |
+ } |
324 |
+ } |
324 |
+ } |
325 |
+ } |
Lines 327-333
Link Here
|
327 |
+ |
328 |
+ |
328 |
+static void kqemu_destroy(struct kqemu_instance *ks) |
329 |
+static void kqemu_destroy(struct kqemu_instance *ks) |
329 |
+{ |
330 |
+{ |
|
|
331 |
+#if __FreeBSD_version >= 500000 |
330 |
+ struct cdev *dev = ks->kqemu_dev; |
332 |
+ struct cdev *dev = ks->kqemu_dev; |
|
|
333 |
+#endif |
331 |
+ |
334 |
+ |
332 |
+ if (ks->state) { |
335 |
+ if (ks->state) { |
333 |
+ kqemu_delete(ks->state); |
336 |
+ kqemu_delete(ks->state); |
Lines 335-342
Link Here
|
335 |
+ } |
338 |
+ } |
336 |
+ |
339 |
+ |
337 |
+ free(ks, M_KQEMU); |
340 |
+ free(ks, M_KQEMU); |
338 |
+ dev->si_drv1 = NULL; |
|
|
339 |
+#if __FreeBSD_version >= 500000 |
341 |
+#if __FreeBSD_version >= 500000 |
|
|
342 |
+ dev->si_drv1 = NULL; |
340 |
+ TAILQ_REMOVE(&kqemuhead, ks, kqemu_ent); |
343 |
+ TAILQ_REMOVE(&kqemuhead, ks, kqemu_ent); |
341 |
+ destroy_dev(dev); |
344 |
+ destroy_dev(dev); |
342 |
+#endif |
345 |
+#endif |
Lines 394-400
Link Here
|
394 |
{ |
397 |
{ |
395 |
int error = 0; |
398 |
int error = 0; |
396 |
int ret; |
399 |
int ret; |
397 |
@@ -231,8 +383,9 @@ |
400 |
@@ -231,8 +390,9 @@ |
398 |
break; |
401 |
break; |
399 |
} |
402 |
} |
400 |
d1 = *(struct kqemu_init *)addr; |
403 |
d1 = *(struct kqemu_init *)addr; |
Lines 406-412
Link Here
|
406 |
if (s == NULL) { |
409 |
if (s == NULL) { |
407 |
error = ENOMEM; |
410 |
error = ENOMEM; |
408 |
break; |
411 |
break; |
409 |
@@ -248,9 +401,16 @@ |
412 |
@@ -248,9 +408,16 @@ |
410 |
} |
413 |
} |
411 |
ctx = kqemu_get_cpu_state(s); |
414 |
ctx = kqemu_get_cpu_state(s); |
412 |
*ctx = *(struct kqemu_cpu_state *)addr; |
415 |
*ctx = *(struct kqemu_cpu_state *)addr; |
Lines 423-429
Link Here
|
423 |
*(struct kqemu_cpu_state *)addr = *ctx; |
426 |
*(struct kqemu_cpu_state *)addr = *ctx; |
424 |
break; |
427 |
break; |
425 |
} |
428 |
} |
426 |
@@ -265,10 +425,22 @@ |
429 |
@@ -265,10 +432,22 @@ |
427 |
|
430 |
|
428 |
/* ARGSUSED */ |
431 |
/* ARGSUSED */ |
429 |
static int |
432 |
static int |
Lines 447-453
Link Here
|
447 |
} |
450 |
} |
448 |
|
451 |
|
449 |
/* ARGSUSED */ |
452 |
/* ARGSUSED */ |
450 |
@@ -276,15 +448,55 @@ |
453 |
@@ -276,15 +455,55 @@ |
451 |
kqemu_modevent(module_t mod __unused, int type, void *data __unused) |
454 |
kqemu_modevent(module_t mod __unused, int type, void *data __unused) |
452 |
{ |
455 |
{ |
453 |
int error = 0; |
456 |
int error = 0; |