generate_head.c Source File
Back to the index.
src
cpus
generate_head.c
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2005-2009 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
#include <stdio.h>
29
#include <stdlib.h>
30
#include <string.h>
31
32
33
/* NOTE: Static return buffer, so calling it multiple times in the
34
same printf statement with the same argument works :-) but not
35
with different args. Hahaha. Really ugly. */
36
char
*
uppercase
(
char
*l)
37
{
38
static
char
staticbuf[1000];
39
size_t
i = 0;
40
41
while
(*l && i <
sizeof
(staticbuf)) {
42
char
u = *l++;
43
if
(u >=
'a'
&& u <=
'z'
)
44
u -= 32;
45
staticbuf[i++] = u;
46
}
47
if
(i ==
sizeof
(staticbuf))
48
i--;
49
staticbuf[i] = 0;
50
return
staticbuf;
51
}
52
53
54
int
main
(
int
argc,
char
*argv[])
55
{
56
char
*a, *b;
57
58
if
(argc != 3) {
59
fprintf(stderr,
"usage: %s arch Arch\n"
, argv[0]);
60
fprintf(stderr,
"Example: %s alpha Alpha\n"
, argv[0]);
61
fprintf(stderr,
" or: %s arm ARM\n"
, argv[0]);
62
exit(1);
63
}
64
65
a = argv[1];
66
b = argv[2];
67
68
69
printf(
"\n/* AUTOMATICALLY GENERATED! Do not edit. */\n\n"
);
70
71
printf(
"#include <assert.h>\n"
);
72
printf(
"#include \"debugger.h\"\n"
);
73
74
printf(
"#define DYNTRANS_MAX_VPH_TLB_ENTRIES "
75
"%s_MAX_VPH_TLB_ENTRIES\n"
,
uppercase
(a));
76
printf(
"#define DYNTRANS_ARCH %s\n"
, a);
77
printf(
"#define DYNTRANS_%s\n"
,
uppercase
(a));
78
79
/* For 64-bit platforms, arch_L2N, and arch_L3N must be defined. */
80
printf(
"#ifndef DYNTRANS_32\n"
);
81
printf(
"#define DYNTRANS_L2N %s_L2N\n"
82
"#define DYNTRANS_L3N %s_L3N\n"
83
"#if !defined(%s_L2N) || !defined(%s_L3N)\n"
84
"#error arch_L2N, and arch_L3N must be defined for this arch!\n"
85
"#endif\n"
,
86
uppercase
(a),
uppercase
(a),
uppercase
(a),
uppercase
(a));
87
printf(
"#define DYNTRANS_L2_64_TABLE %s_l2_64_table\n"
88
"#define DYNTRANS_L3_64_TABLE %s_l3_64_table\n"
, a, a);
89
printf(
"#endif\n"
);
90
91
/* Default pagesize is 4KB. */
92
printf(
"#ifndef DYNTRANS_PAGESIZE\n"
93
"#define DYNTRANS_PAGESIZE 4096\n"
94
"#endif\n"
);
95
96
printf(
"#define DYNTRANS_IC %s_instr_call\n"
, a);
97
printf(
"#define DYNTRANS_IC_ENTRIES_PER_PAGE "
98
"%s_IC_ENTRIES_PER_PAGE\n"
,
uppercase
(a));
99
printf(
"#define DYNTRANS_INSTR_ALIGNMENT_SHIFT "
100
"%s_INSTR_ALIGNMENT_SHIFT\n"
,
uppercase
(a));
101
printf(
"#define DYNTRANS_TC_PHYSPAGE %s_tc_physpage\n"
, a);
102
printf(
"#define DYNTRANS_INVALIDATE_TLB_ENTRY "
103
"%s_invalidate_tlb_entry\n"
, a);
104
printf(
"#define DYNTRANS_ADDR_TO_PAGENR %s_ADDR_TO_PAGENR\n"
,
105
uppercase
(a));
106
printf(
"#define DYNTRANS_PC_TO_IC_ENTRY %s_PC_TO_IC_ENTRY\n"
,
107
uppercase
(a));
108
printf(
"#define DYNTRANS_TC_ALLOCATE "
109
"%s_tc_allocate_default_page\n"
, a);
110
printf(
"#define DYNTRANS_TC_PHYSPAGE %s_tc_physpage\n"
, a);
111
printf(
"#define DYNTRANS_PC_TO_POINTERS %s_pc_to_pointers\n"
, a);
112
printf(
"#define DYNTRANS_PC_TO_POINTERS_GENERIC "
113
"%s_pc_to_pointers_generic\n"
, a);
114
printf(
"#define COMBINE_INSTRUCTIONS %s_combine_instructions\n"
, a);
115
printf(
"#define DISASSEMBLE %s_cpu_disassemble_instr\n"
, a);
116
117
printf(
"\nextern volatile int single_step, single_step_breakpoint;"
118
"\nextern int debugger_n_steps_left_before_interaction;\n"
119
"extern int old_show_trace_tree;\n"
120
"extern int old_instruction_trace;\n"
121
"extern int old_quiet_mode;\n"
122
"extern int quiet_mode;\n"
);
123
124
printf(
"\n/* instr uses the same names as in "
125
"cpu_%s_instr.c */\n#define instr(n) %s_instr_ ## n\n\n"
, a, a);
126
127
printf(
"#ifdef DYNTRANS_DUALMODE_32\n"
128
"#define instr32(n) %s32_instr_ ## n\n\n"
, a);
129
printf(
"#endif\n\n"
);
130
131
printf(
"\n#define X(n) void %s_instr_ ## n(struct cpu *cpu, \\\n"
132
" struct %s_instr_call *ic)\n"
, a, a);
133
134
printf(
"\n/*\n * nothing: Do nothing.\n *\n"
135
" * The difference between this function and a \"nop\" "
136
"instruction is that\n * this function does not increase "
137
"the program counter. It is used to \"get out\" of running in "
138
"translated\n * mode.\n */\n"
);
139
printf(
"X(nothing)\n{\n"
);
140
printf(
"\tcpu->cd.%s.next_ic --;\n"
, a);
141
printf(
"}\n\n"
);
142
143
/* Ugly special hacks for SH[34]: */
144
if
(strcasecmp(argv[1],
"sh"
) == 0) {
145
printf(
"static struct %s_instr_call nothing_call = { "
146
"instr(nothing), {0,0} };\n"
, a);
147
}
else
{
148
printf(
"static struct %s_instr_call nothing_call = { "
149
"instr(nothing), {0,0,0} };\n"
, a);
150
}
151
152
printf(
"\n"
);
153
154
return
0;
155
}
main
int main(int argc, char *argv[])
Definition:
generate_head.c:54
uppercase
char * uppercase(char *l)
Definition:
generate_head.c:36
Generated on Tue Mar 24 2020 14:04:48 for GXemul by
1.8.17