Release 950522
[wine] / debugger / dbg.y
1
2 %{
3
4 /* Parser for command lines in the Wine debugger
5  *
6  * Version 1.0
7  * Eric Youngdale
8  * 9/93
9  */
10
11 #include <stdio.h>
12 #include <signal.h>
13 #include "ldt.h"
14 #include "windows.h"
15 #include "wine.h"
16
17 #define YYSTYPE int
18
19 #include "regpos.h"
20 extern FILE * yyin;
21 unsigned int * regval = NULL;
22 unsigned int dbg_mask = 0;
23 unsigned int dbg_mode = 0;
24
25 void issue_prompt(void);
26 void mode_command(int);
27 %}
28
29
30 %token CONT
31 %token QUIT
32 %token HELP
33 %token BACKTRACE
34 %token INFO
35 %token STACK
36 %token SEGMENTS
37 %token REG
38 %token REGS
39 %token NUM
40 %token ENABLE
41 %token DISABLE
42 %token BREAK
43 %token SET
44 %token MODE
45 %token PRINT
46 %token FILE_IDENTIFIER
47 %token IDENTIFIER
48 %token NO_SYMBOL
49 %token SYMBOLFILE
50 %token DEFINE
51 %token ABORT
52
53 %%
54
55  input:  /* empty */
56         | input line  { issue_prompt(); }
57
58  line:          '\n'
59         | infocmd '\n'
60         | error '\n'       { yyerrok; }
61         | QUIT  '\n'       { exit(0); }
62         | 'q' '\n'         { exit(0); }
63         | HELP  '\n'       { dbg_help(); }
64         | CONT '\n'        { return 0; }
65         | 'c' '\n'         { return 0; }
66         | ABORT '\n'       { kill(getpid(), SIGABRT); }
67         | SYMBOLFILE FILE_IDENTIFIER '\n' { read_symboltable($2); }
68         | DEFINE IDENTIFIER expr '\n'  { add_hash($2, 0, $3); }
69         | MODE NUM         { mode_command($2); }
70         | ENABLE NUM       { enable_break($2); }
71         | DISABLE NUM      { disable_break($2); }
72         | BREAK '*' expr   { add_break($3); }
73         | x_command
74         | BACKTRACE '\n'   { dbg_bt(); }
75         | print_command
76         | deposit_command
77
78 deposit_command:
79         SET REG '=' expr '\n' { if(regval) regval[$2] = $4; else application_not_running();}
80         | SET '*' expr '=' expr '\n' { *((unsigned int *) $3) = $5; }
81         | SET symbol '=' expr '\n' { *((unsigned int *) $2) = $4; }
82
83
84 x_command:
85           'x' expr  '\n' { examine_memory($2, 1, 'x'); }
86         | 'x' '/' fmt expr  '\n' { examine_memory($4, 1, $3); }
87         | 'x' '/' NUM fmt expr  '\n' { examine_memory($5, $3, $4); }
88
89 print:
90           'p'
91         | PRINT
92         
93  print_command:
94           print expr '\n' { examine_memory(((unsigned int) &$2 ), 1, 'x'); }
95         | print '/' fmt expr '\n' { examine_memory((unsigned int) &$4, 1, $3); }
96         | print '/' NUM fmt expr '\n' { examine_memory((unsigned int) &$5, $3, $4); }
97
98  fmt:  'x'     { $$ = 'x'; }
99         | 'd'  { $$ = 'd'; }
100         | 'i'  { $$ = 'i'; }
101         | 'w'  { $$ = 'w'; }
102         | 's'  { $$ = 's'; }
103         | 'c'  { $$ = 'c'; }
104         | 'b' { $$ = 'b'; }
105
106  symbol: IDENTIFIER             { $$ = find_hash($1);
107                                    if($$ == 0xffffffff) {
108                                            fprintf(stderr,"Symbol %s not found\n", $1);
109                                            YYERROR;
110                                    }
111                                 } 
112
113  expr:  NUM                     { $$ = $1;      }
114         | REG                   { if(regval) $$ = regval[$1]; else application_not_running();}
115         | symbol                { $$ = $1; }
116         | expr '+' NUM          { $$ = $1 + $3; }
117         | expr '-' NUM          { $$ = $1 - $3; }
118         | '(' expr ')'          { $$ = $2; }
119         | '*' expr              { $$ = *((unsigned int *) $2); }
120         
121  infocmd: INFO REGS     { info_reg(); }
122         | INFO STACK    { info_stack(); }
123         | INFO SEGMENTS { LDT_Print(); }
124         | INFO BREAK    { info_break(); }
125
126
127 %%
128
129 void 
130 issue_prompt(){
131 #ifndef USE_READLINE
132         fprintf(stderr,"Wine-dbg>");
133 #endif
134 }
135
136 void mode_command(int newmode)
137 {
138   if(newmode == 16){
139     dbg_mask = 0xffff;
140     dbg_mode = 16;
141     return;
142   }
143   if(newmode == 32){ 
144     dbg_mask = 0xffffffff;
145     dbg_mode = 32;
146     return;
147   }
148   fprintf(stderr,"Invalid mode (use 16 or 32)\n");
149 }
150
151 static int loaded_symbols = 0;
152
153 void
154 wine_debug(int signal, int * regs)
155 {
156         static int dummy_regs[32];
157         char SymbolTableFile[256];
158 #ifdef YYDEBUG
159         yydebug = 0;
160 #endif
161
162         yyin = stdin;
163         regval = regs ? regs : dummy_regs;
164
165         if (SC_CS == WINE_CODE_SELECTOR)
166         {
167                 dbg_mask = 0xffffffff;
168                 dbg_mode = 32;
169         } else
170         {
171                 dbg_mask = 0xffff;
172                 dbg_mode = 16;
173         }
174         fprintf(stderr,"In %d bit mode.\n", dbg_mode);
175
176         if(dbg_mode == 32 && !loaded_symbols)
177         {
178                 loaded_symbols++;
179                 GetPrivateProfileString("wine", "SymbolTableFile", "wine.sym",
180                         SymbolTableFile, sizeof(SymbolTableFile), WINE_INI);
181                 read_symboltable(SymbolTableFile);
182         }
183
184         /* Remove the breakpoints from memory... */
185         insert_break(0);
186
187         /* If we stopped on a breakpoint, report this fact */
188         if(signal == SIGTRAP)
189           {
190             unsigned int addr;
191             int bpnum;
192             addr = SC_EIP(dbg_mask);
193             if((addr & 0xffff0000) == 0 && dbg_mode == 16)
194               addr = PTR_SEG_OFF_TO_LIN( SC_CS, addr );
195             if(should_continue(bpnum=get_bpnum(addr))){
196                 insert_break(1);
197                 return;
198             }
199             fprintf(stderr,"Stopped on breakpoint %d\n", bpnum);
200           }
201
202         /* Show where we crashed */
203         if(regs)
204           examine_memory(SC_EIP(dbg_mask), 1, 'i');
205
206         issue_prompt();
207
208         yyparse();
209         flush_symbols();
210
211         /* Re-insert the breakpoints from memory... */
212         insert_break(1);
213
214         fprintf(stderr,"Returning to Wine...\n");
215
216 }
217
218
219 int yyerror(char * s)
220 {
221         fprintf(stderr,"%s\n", s);
222         return 0;
223 }
224