/[gxemul]/upstream/0.4.6/src/useremul/useremul_freebsd.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /upstream/0.4.6/src/useremul/useremul_freebsd.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 43 - (show annotations)
Mon Oct 8 16:22:43 2007 UTC (16 years, 8 months ago) by dpavlin
File MIME type: text/plain
File size: 4079 byte(s)
0.4.6
1 /*
2 * Copyright (C) 2004-2007 Anders Gavare. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * 3. The name of the author may not be used to endorse or promote products
13 * derived from this software without specific prior written permission.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 *
27 *
28 * $Id: useremul_freebsd.c,v 1.5 2007/06/15 01:32:58 debug Exp $
29 *
30 * FreeBSD userland (syscall) emulation.
31 */
32
33 #include <stdio.h>
34 #include <stdlib.h>
35
36 #include "cpu.h"
37 #include "machine.h"
38 #include "useremul.h"
39
40 #include "errno_freebsd.h"
41 #include "syscall_freebsd.h"
42
43
44 /*
45 * useremul_freebsd_setup():
46 *
47 * Set up an emulated userland environment suitable for running FreeBSD
48 * binaries.
49 */
50 void useremul_freebsd_setup(struct cpu *cpu, int argc, char **host_argv)
51 {
52 switch (cpu->machine->arch) {
53
54 case ARCH_ALPHA:
55 /* According to FreeBSD's /usr/src/lib/csu/alpha/crt1.c: */
56 /* a0 = char **ap */
57 /* a1 = void (*cleanup)(void) from shared loader */
58 /* a2 = struct Struct_Obj_Entry *obj from shared loader */
59 /* a3 = struct ps_strings *ps_strings */
60 cpu->cd.alpha.r[ALPHA_A0] = 0;
61 cpu->cd.alpha.r[ALPHA_A1] = 0;
62 cpu->cd.alpha.r[ALPHA_A2] = 0;
63 cpu->cd.alpha.r[ALPHA_A3] = 0;
64
65 cpu->cd.alpha.r[ALPHA_SP] = 0x11ffc000;
66 break;
67
68 default:
69 fatal("The selected architecture is not supported yet for"
70 " FreeBSD syscall emulation.\n");
71 exit(1);
72 }
73 }
74
75
76 /*
77 * useremul_freebsd():
78 *
79 * FreeBSD/Alpha syscall emulation.
80 */
81 void useremul_freebsd(struct cpu *cpu, uint32_t code)
82 {
83 int syscall_nr = -1;
84 int64_t result = 0, error_flag = 0;
85 uint64_t arg0=0, arg1=0, arg2=0, arg3=0, arg4=0, arg5=0;
86
87
88 /*
89 * Retrieve syscall arguments (in registers and/or the stack):
90 */
91
92 switch (cpu->machine->arch) {
93
94 case ARCH_ALPHA:
95 syscall_nr = cpu->cd.alpha.r[ALPHA_V0];
96 arg0 = cpu->cd.alpha.r[ALPHA_A0];
97 arg1 = cpu->cd.alpha.r[ALPHA_A1];
98 arg2 = cpu->cd.alpha.r[ALPHA_A2];
99 arg3 = cpu->cd.alpha.r[ALPHA_A3];
100 arg4 = cpu->cd.alpha.r[ALPHA_A4];
101 arg5 = cpu->cd.alpha.r[ALPHA_A5];
102
103 if (syscall_nr == FREEBSD_SYS___syscall) {
104 syscall_nr = arg0;
105 arg0 = arg1;
106 arg1 = arg2;
107 arg2 = arg3;
108 arg3 = arg4;
109 arg4 = arg5;
110 /* TODO: stack arguments */
111 }
112
113 break;
114 }
115
116
117 /*
118 * Handle the syscall:
119 */
120
121 switch (syscall_nr) {
122
123 case FREEBSD_SYS_exit:
124 useremul_syscall_exit(cpu, arg0);
125 break;
126
127 case FREEBSD_SYS_sync:
128 useremul_syscall_sync(cpu);
129 break;
130
131 default:
132 fatal("[ UNIMPLEMENTED FreeBSD syscall nr %i ]\n", syscall_nr);
133 error_flag = 1; result = FREEBSD_ENOSYS;
134
135 /* For now, let's abort execution: */
136 cpu->running = 0;
137 }
138
139
140 /*
141 * Return:
142 */
143
144 switch (cpu->machine->arch) {
145
146 case ARCH_ALPHA:
147 cpu->cd.alpha.r[ALPHA_V0] = result;
148 cpu->cd.alpha.r[ALPHA_A3] = error_flag;
149 break;
150 }
151 }
152

  ViewVC Help
Powered by ViewVC 1.1.26