generate_head.c Source File

Back to the index.

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 }
char * uppercase(char *l)
Definition: generate_head.c:36
int main(int argc, char *argv[])
Definition: generate_head.c:54

Generated on Sun Sep 30 2018 16:05:18 for GXemul by doxygen 1.8.13