1 /*
2 * UAE - The Un*x Amiga Emulator
3 *
4 * Call Amiga Exec functions outside the main UAE thread.
5 *
6 * Copyright 1999 Patrick Ohly
7 *
8 * Uses the EXTER interrupt that is setup in filesys.c
9 * and needs thread support.
10 */
11
12 #include "sysconfig.h"
13 #include "sysdeps.h"
14
15 #include "threaddep/thread.h"
16 #include "options.h"
17 #include "memory.h"
18 #include "custom.h"
19 #include "newcpu.h"
20 #include "disk.h"
21 #include "traps.h"
22 #include "autoconf.h"
23 #include "filesys.h"
24 #include "execlib.h"
25 #include "native2amiga.h"
26
27 smp_comm_pipe native2amiga_pending;
28
29 /*
30 * to be called when setting up the hardware
31 */
32
native2amiga_install(void)33 void native2amiga_install (void)
34 {
35 init_comm_pipe (&native2amiga_pending, 10, 2);
36 }
37
38 /*
39 * to be called when the Amiga boots, i.e. by filesys_diagentry()
40 */
native2amiga_startup(void)41 void native2amiga_startup (void)
42 {
43 }
44
45 #ifdef SUPPORT_THREADS
uae_ReplyMsg(uaecptr msg)46 void uae_ReplyMsg (uaecptr msg)
47 {
48 write_comm_pipe_int (&native2amiga_pending, 2, 0);
49 write_comm_pipe_u32 (&native2amiga_pending, msg, 1);
50
51 uae_int_requested = 1;
52 }
53
uae_PutMsg(uaecptr port,uaecptr msg)54 void uae_PutMsg (uaecptr port, uaecptr msg)
55 {
56 uae_pt data;
57 data.i = 1;
58 write_comm_pipe_int (&native2amiga_pending, 1, 0);
59 write_comm_pipe_u32 (&native2amiga_pending, port, 0);
60 write_comm_pipe_u32 (&native2amiga_pending, msg, 1);
61
62 uae_int_requested = 1;
63 }
64
uae_Signal(uaecptr task,uae_u32 mask)65 void uae_Signal (uaecptr task, uae_u32 mask)
66 {
67 write_comm_pipe_int (&native2amiga_pending, 0, 0);
68 write_comm_pipe_u32 (&native2amiga_pending, task, 0);
69 write_comm_pipe_int (&native2amiga_pending, mask, 1);
70
71 uae_int_requested = 1;
72 }
73 #endif
74
uae_NewList(uaecptr list)75 void uae_NewList (uaecptr list)
76 {
77 put_long (list, list + 4);
78 put_long (list + 4, 0);
79 put_long (list + 8, list);
80 }
81
uae_AllocMem(TrapContext * ctx,uae_u32 size,uae_u32 flags)82 uaecptr uae_AllocMem (TrapContext *ctx, uae_u32 size, uae_u32 flags)
83 {
84 m68k_dreg (regs, 0) = size;
85 m68k_dreg (regs, 1) = flags;
86 return CallLib (ctx, get_long (4), -198); /* AllocMem */
87 }
88
uae_FreeMem(TrapContext * ctx,uaecptr memory,uae_u32 size)89 void uae_FreeMem (TrapContext *ctx, uaecptr memory, uae_u32 size)
90 {
91 m68k_dreg (regs, 0) = size;
92 m68k_areg (regs, 1) = memory;
93 CallLib (ctx, get_long (4), -0xD2); /* FreeMem */
94 }
95