1 |
dpavlin |
14 |
/* |
2 |
dpavlin |
34 |
* Copyright (C) 2005-2007 Anders Gavare. All rights reserved. |
3 |
dpavlin |
14 |
* |
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 |
dpavlin |
44 |
* $Id: generate_tail.c,v 1.21 2007/06/28 13:36:47 debug Exp $ |
29 |
dpavlin |
14 |
*/ |
30 |
|
|
|
31 |
|
|
#include <stdio.h> |
32 |
|
|
#include <stdlib.h> |
33 |
|
|
|
34 |
|
|
|
35 |
|
|
char *uppercase(char *l) |
36 |
|
|
{ |
37 |
|
|
static char staticbuf[1000]; |
38 |
dpavlin |
22 |
size_t i = 0; |
39 |
dpavlin |
14 |
|
40 |
|
|
while (*l && i < sizeof(staticbuf)) { |
41 |
|
|
char u = *l++; |
42 |
|
|
if (u >= 'a' && u <= 'z') |
43 |
|
|
u -= 32; |
44 |
|
|
staticbuf[i++] = u; |
45 |
|
|
} |
46 |
|
|
if (i == sizeof(staticbuf)) |
47 |
|
|
i--; |
48 |
|
|
staticbuf[i] = 0; |
49 |
|
|
return staticbuf; |
50 |
|
|
} |
51 |
|
|
|
52 |
|
|
|
53 |
|
|
int main(int argc, char *argv[]) |
54 |
|
|
{ |
55 |
|
|
char *a, *b; |
56 |
|
|
|
57 |
|
|
if (argc != 3) { |
58 |
|
|
fprintf(stderr, "usage: %s arch Arch\n", argv[0]); |
59 |
|
|
fprintf(stderr, "Example: %s alpha Alpha\n", argv[0]); |
60 |
|
|
fprintf(stderr, " or: %s arm ARM\n", argv[0]); |
61 |
|
|
exit(1); |
62 |
|
|
} |
63 |
|
|
|
64 |
|
|
a = argv[1]; |
65 |
|
|
b = argv[2]; |
66 |
|
|
|
67 |
|
|
printf("\n/*\n * AUTOMATICALLY GENERATED! Do not edit.\n */\n\n"); |
68 |
|
|
|
69 |
dpavlin |
34 |
printf("extern size_t dyntrans_cache_size;\n"); |
70 |
|
|
|
71 |
dpavlin |
14 |
printf("#ifdef DYNTRANS_32\n"); |
72 |
|
|
printf("#define MODE32\n"); |
73 |
|
|
printf("#endif\n"); |
74 |
|
|
|
75 |
dpavlin |
44 |
printf("#define DYNTRANS_FUNCTION_TRACE_DEF " |
76 |
dpavlin |
14 |
"%s_cpu_functioncall_trace\n", a); |
77 |
|
|
printf("#include \"cpu_dyntrans.c\"\n"); |
78 |
dpavlin |
44 |
printf("#undef DYNTRANS_FUNCTION_TRACE_DEF\n\n"); |
79 |
dpavlin |
14 |
|
80 |
dpavlin |
26 |
printf("#define DYNTRANS_INIT_TABLES " |
81 |
|
|
"%s_cpu_init_tables\n", a); |
82 |
dpavlin |
24 |
printf("#include \"cpu_dyntrans.c\"\n"); |
83 |
dpavlin |
26 |
printf("#undef DYNTRANS_INIT_TABLES\n\n"); |
84 |
dpavlin |
24 |
|
85 |
dpavlin |
44 |
printf("#define DYNTRANS_TC_ALLOCATE_DEFAULT_PAGE_DEF " |
86 |
dpavlin |
14 |
"%s_tc_allocate_default_page\n", a); |
87 |
|
|
printf("#include \"cpu_dyntrans.c\"\n"); |
88 |
dpavlin |
44 |
printf("#undef DYNTRANS_TC_ALLOCATE_DEFAULT_PAGE_DEF\n\n"); |
89 |
dpavlin |
14 |
|
90 |
|
|
printf("#define DYNTRANS_INVAL_ENTRY\n"); |
91 |
|
|
printf("#include \"cpu_dyntrans.c\"\n"); |
92 |
|
|
printf("#undef DYNTRANS_INVAL_ENTRY\n\n"); |
93 |
|
|
|
94 |
dpavlin |
18 |
printf("#define DYNTRANS_INVALIDATE_TC " |
95 |
|
|
"%s_invalidate_translation_caches\n", a); |
96 |
dpavlin |
14 |
printf("#include \"cpu_dyntrans.c\"\n"); |
97 |
dpavlin |
18 |
printf("#undef DYNTRANS_INVALIDATE_TC\n\n"); |
98 |
dpavlin |
14 |
|
99 |
|
|
printf("#define DYNTRANS_INVALIDATE_TC_CODE " |
100 |
|
|
"%s_invalidate_code_translation\n", a); |
101 |
|
|
printf("#include \"cpu_dyntrans.c\"\n"); |
102 |
|
|
printf("#undef DYNTRANS_INVALIDATE_TC_CODE\n\n"); |
103 |
|
|
|
104 |
|
|
printf("#define DYNTRANS_UPDATE_TRANSLATION_TABLE " |
105 |
|
|
"%s_update_translation_table\n", a); |
106 |
|
|
printf("#include \"cpu_dyntrans.c\"\n"); |
107 |
|
|
printf("#undef DYNTRANS_UPDATE_TRANSLATION_TABLE\n\n"); |
108 |
|
|
|
109 |
|
|
printf("#define MEMORY_RW %s_memory_rw\n", a); |
110 |
|
|
printf("#define MEM_%s\n", uppercase(a)); |
111 |
dpavlin |
44 |
printf("#include \"memory_rw.c\"\n"); |
112 |
dpavlin |
14 |
printf("#undef MEM_%s\n", uppercase(a)); |
113 |
|
|
printf("#undef MEMORY_RW\n\n"); |
114 |
|
|
|
115 |
|
|
printf("#define DYNTRANS_PC_TO_POINTERS_FUNC %s_pc_to_pointers\n", a); |
116 |
|
|
printf("#define DYNTRANS_PC_TO_POINTERS_GENERIC " |
117 |
|
|
"%s_pc_to_pointers_generic\n", a); |
118 |
|
|
printf("#include \"cpu_dyntrans.c\"\n"); |
119 |
|
|
printf("#undef DYNTRANS_PC_TO_POINTERS_FUNC\n\n"); |
120 |
|
|
printf("#undef DYNTRANS_PC_TO_POINTERS_GENERIC\n\n"); |
121 |
|
|
|
122 |
|
|
|
123 |
|
|
printf("#define COMBINE_INSTRUCTIONS %s_combine_instructions\n", a); |
124 |
|
|
printf("#ifndef DYNTRANS_32\n"); |
125 |
|
|
printf("#define reg(x) (*((uint64_t *)(x)))\n"); |
126 |
|
|
printf("#define MODE_uint_t uint64_t\n"); |
127 |
|
|
printf("#define MODE_int_t int64_t\n"); |
128 |
|
|
printf("#else\n"); |
129 |
|
|
printf("#define reg(x) (*((uint32_t *)(x)))\n"); |
130 |
|
|
printf("#define MODE_uint_t uint32_t\n"); |
131 |
|
|
printf("#define MODE_int_t int32_t\n"); |
132 |
|
|
printf("#endif\n"); |
133 |
dpavlin |
22 |
printf("#define COMBINE(n) %s_combine_ ## n\n", a); |
134 |
|
|
printf("#include \"quick_pc_to_pointers.h\"\n"); |
135 |
dpavlin |
14 |
printf("#include \"cpu_%s_instr.c\"\n\n", a); |
136 |
|
|
|
137 |
dpavlin |
44 |
printf("#define DYNTRANS_RUN_INSTR_DEF %s_run_instr\n", a); |
138 |
dpavlin |
28 |
printf("#include \"cpu_dyntrans.c\"\n"); |
139 |
dpavlin |
44 |
printf("#undef DYNTRANS_RUN_INSTR_DEF\n\n"); |
140 |
dpavlin |
14 |
|
141 |
dpavlin |
28 |
|
142 |
dpavlin |
14 |
printf("#ifdef DYNTRANS_DUALMODE_32\n"); |
143 |
|
|
printf("#undef COMBINE_INSTRUCTIONS\n"); |
144 |
|
|
printf("#define COMBINE_INSTRUCTIONS %s32_combine_instructions\n", a); |
145 |
|
|
printf("#undef X\n#undef instr\n#undef reg\n" |
146 |
|
|
"#define X(n) void %s32_instr_ ## n(struct cpu *cpu, \\\n" |
147 |
|
|
"\tstruct %s_instr_call *ic)\n", a, a); |
148 |
|
|
printf("#define instr(n) %s32_instr_ ## n\n", a); |
149 |
|
|
printf("#ifdef HOST_LITTLE_ENDIAN\n"); |
150 |
|
|
printf("#define reg(x) ( *((uint32_t *)(x)) )\n"); |
151 |
|
|
printf("#else\n"); |
152 |
|
|
printf("#define reg(x) ( *((uint32_t *)(x)+1) )\n"); |
153 |
|
|
printf("#endif\n"); |
154 |
|
|
printf("#define MODE32\n"); |
155 |
|
|
printf("#undef MODE_uint_t\n#undef MODE_int_t\n"); |
156 |
|
|
printf("#define MODE_uint_t uint32_t\n"); |
157 |
|
|
printf("#define MODE_int_t int32_t\n"); |
158 |
|
|
|
159 |
|
|
printf("#define DYNTRANS_INVAL_ENTRY\n"); |
160 |
|
|
printf("#undef DYNTRANS_INVALIDATE_TLB_ENTRY\n" |
161 |
|
|
"#define DYNTRANS_INVALIDATE_TLB_ENTRY " |
162 |
|
|
"%s32_invalidate_tlb_entry\n", a); |
163 |
|
|
printf("#include \"cpu_dyntrans.c\"\n"); |
164 |
|
|
printf("#undef DYNTRANS_INVAL_ENTRY\n\n"); |
165 |
dpavlin |
18 |
printf("#define DYNTRANS_INVALIDATE_TC " |
166 |
|
|
"%s32_invalidate_translation_caches\n", a); |
167 |
dpavlin |
14 |
printf("#include \"cpu_dyntrans.c\"\n"); |
168 |
dpavlin |
18 |
printf("#undef DYNTRANS_INVALIDATE_TC\n\n"); |
169 |
dpavlin |
14 |
printf("#define DYNTRANS_INVALIDATE_TC_CODE " |
170 |
|
|
"%s32_invalidate_code_translation\n", a); |
171 |
|
|
printf("#include \"cpu_dyntrans.c\"\n"); |
172 |
|
|
printf("#undef DYNTRANS_INVALIDATE_TC_CODE\n\n"); |
173 |
|
|
printf("#define DYNTRANS_UPDATE_TRANSLATION_TABLE " |
174 |
|
|
"%s32_update_translation_table\n", a); |
175 |
|
|
printf("#include \"cpu_dyntrans.c\"\n"); |
176 |
|
|
printf("#undef DYNTRANS_UPDATE_TRANSLATION_TABLE\n\n"); |
177 |
|
|
printf("#define DYNTRANS_PC_TO_POINTERS_FUNC %s32_pc_to_pointers\n", a); |
178 |
|
|
printf("#define DYNTRANS_PC_TO_POINTERS_GENERIC " |
179 |
|
|
"%s32_pc_to_pointers_generic\n", a); |
180 |
|
|
printf("#undef DYNTRANS_PC_TO_POINTERS\n" |
181 |
|
|
"#define DYNTRANS_PC_TO_POINTERS %s32_pc_to_pointers\n", a); |
182 |
|
|
printf("#include \"cpu_dyntrans.c\"\n"); |
183 |
|
|
printf("#undef DYNTRANS_PC_TO_POINTERS_FUNC\n\n"); |
184 |
|
|
printf("#undef DYNTRANS_PC_TO_POINTERS_GENERIC\n\n"); |
185 |
dpavlin |
22 |
printf("#undef COMBINE\n"); |
186 |
|
|
printf("#define COMBINE(n) %s32_combine_ ## n\n", a); |
187 |
|
|
printf("#include \"quick_pc_to_pointers.h\"\n"); |
188 |
dpavlin |
14 |
printf("#include \"cpu_%s_instr.c\"\n", a); |
189 |
|
|
|
190 |
|
|
printf("\n#undef DYNTRANS_PC_TO_POINTERS\n" |
191 |
|
|
"#define DYNTRANS_PC_TO_POINTERS %s_pc_to_pointers\n" |
192 |
|
|
"#define DYNTRANS_PC_TO_POINTERS32 %s32_pc_to_pointers\n\n", a, a); |
193 |
|
|
|
194 |
dpavlin |
44 |
printf("#define DYNTRANS_RUN_INSTR_DEF %s32_run_instr\n", a); |
195 |
dpavlin |
28 |
printf("#include \"cpu_dyntrans.c\"\n"); |
196 |
dpavlin |
44 |
printf("#undef DYNTRANS_RUN_INSTR_DEF\n\n"); |
197 |
dpavlin |
28 |
|
198 |
dpavlin |
14 |
printf("#endif /* DYNTRANS_DUALMODE_32 */\n\n\n"); |
199 |
|
|
|
200 |
|
|
|
201 |
|
|
printf("CPU_FAMILY_INIT(%s,\"%s\")\n\n", a, b); |
202 |
|
|
|
203 |
|
|
return 0; |
204 |
|
|
} |
205 |
|
|
|