]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/gdb/gdb/i386-tdep.c
This commit was generated by cvs2svn to compensate for changes in r37510,
[FreeBSD/FreeBSD.git] / contrib / gdb / gdb / i386-tdep.c
1 /* Intel 386 target-dependent stuff.
2    Copyright (C) 1988, 1989, 1991, 1994, 1995, 1996 Free Software Foundation, Inc.
3
4 This file is part of GDB.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
19
20 #include "defs.h"
21 #include "gdb_string.h"
22 #include "frame.h"
23 #include "inferior.h"
24 #include "gdbcore.h"
25 #include "target.h"
26 #include "floatformat.h"
27 #include "symtab.h"
28
29 static long i386_get_frame_setup PARAMS ((CORE_ADDR));
30
31 static void i386_follow_jump PARAMS ((void));
32
33 static void codestream_read PARAMS ((unsigned char *, int));
34
35 static void codestream_seek PARAMS ((CORE_ADDR));
36
37 static unsigned char codestream_fill PARAMS ((int));
38
39 /* Stdio style buffering was used to minimize calls to ptrace, but this
40    buffering did not take into account that the code section being accessed
41    may not be an even number of buffers long (even if the buffer is only
42    sizeof(int) long).  In cases where the code section size happened to
43    be a non-integral number of buffers long, attempting to read the last
44    buffer would fail.  Simply using target_read_memory and ignoring errors,
45    rather than read_memory, is not the correct solution, since legitimate
46    access errors would then be totally ignored.  To properly handle this
47    situation and continue to use buffering would require that this code
48    be able to determine the minimum code section size granularity (not the
49    alignment of the section itself, since the actual failing case that
50    pointed out this problem had a section alignment of 4 but was not a
51    multiple of 4 bytes long), on a target by target basis, and then
52    adjust it's buffer size accordingly.  This is messy, but potentially
53    feasible.  It probably needs the bfd library's help and support.  For
54    now, the buffer size is set to 1.  (FIXME -fnf) */
55
56 #define CODESTREAM_BUFSIZ 1     /* Was sizeof(int), see note above. */
57 static CORE_ADDR codestream_next_addr;
58 static CORE_ADDR codestream_addr;
59 static unsigned char codestream_buf[CODESTREAM_BUFSIZ];
60 static int codestream_off;
61 static int codestream_cnt;
62
63 #define codestream_tell() (codestream_addr + codestream_off)
64 #define codestream_peek() (codestream_cnt == 0 ? \
65                            codestream_fill(1): codestream_buf[codestream_off])
66 #define codestream_get() (codestream_cnt-- == 0 ? \
67                          codestream_fill(0) : codestream_buf[codestream_off++])
68
69 static unsigned char 
70 codestream_fill (peek_flag)
71     int peek_flag;
72 {
73   codestream_addr = codestream_next_addr;
74   codestream_next_addr += CODESTREAM_BUFSIZ;
75   codestream_off = 0;
76   codestream_cnt = CODESTREAM_BUFSIZ;
77   read_memory (codestream_addr, (char *) codestream_buf, CODESTREAM_BUFSIZ);
78   
79   if (peek_flag)
80     return (codestream_peek());
81   else
82     return (codestream_get());
83 }
84
85 static void
86 codestream_seek (place)
87     CORE_ADDR place;
88 {
89   codestream_next_addr = place / CODESTREAM_BUFSIZ;
90   codestream_next_addr *= CODESTREAM_BUFSIZ;
91   codestream_cnt = 0;
92   codestream_fill (1);
93   while (codestream_tell() != place)
94     codestream_get ();
95 }
96
97 static void
98 codestream_read (buf, count)
99      unsigned char *buf;
100      int count;
101 {
102   unsigned char *p;
103   int i;
104   p = buf;
105   for (i = 0; i < count; i++)
106     *p++ = codestream_get ();
107 }
108
109 /* next instruction is a jump, move to target */
110
111 static void
112 i386_follow_jump ()
113 {
114   unsigned char buf[4];
115   long delta;
116
117   int data16;
118   CORE_ADDR pos;
119
120   pos = codestream_tell ();
121
122   data16 = 0;
123   if (codestream_peek () == 0x66)
124     {
125       codestream_get ();
126       data16 = 1;
127     }
128
129   switch (codestream_get ())
130     {
131     case 0xe9:
132       /* relative jump: if data16 == 0, disp32, else disp16 */
133       if (data16)
134         {
135           codestream_read (buf, 2);
136           delta = extract_signed_integer (buf, 2);
137
138           /* include size of jmp inst (including the 0x66 prefix).  */
139           pos += delta + 4; 
140         }
141       else
142         {
143           codestream_read (buf, 4);
144           delta = extract_signed_integer (buf, 4);
145
146           pos += delta + 5;
147         }
148       break;
149     case 0xeb:
150       /* relative jump, disp8 (ignore data16) */
151       codestream_read (buf, 1);
152       /* Sign-extend it.  */
153       delta = extract_signed_integer (buf, 1);
154
155       pos += delta + 2;
156       break;
157     }
158   codestream_seek (pos);
159 }
160
161 /*
162  * find & return amound a local space allocated, and advance codestream to
163  * first register push (if any)
164  *
165  * if entry sequence doesn't make sense, return -1, and leave 
166  * codestream pointer random
167  */
168
169 static long
170 i386_get_frame_setup (pc)
171      CORE_ADDR pc;
172 {
173   unsigned char op;
174
175   codestream_seek (pc);
176
177   i386_follow_jump ();
178
179   op = codestream_get ();
180
181   if (op == 0x58)               /* popl %eax */
182     {
183       /*
184        * this function must start with
185        * 
186        *    popl %eax             0x58
187        *    xchgl %eax, (%esp)  0x87 0x04 0x24
188        * or xchgl %eax, 0(%esp) 0x87 0x44 0x24 0x00
189        *
190        * (the system 5 compiler puts out the second xchg
191        * inst, and the assembler doesn't try to optimize it,
192        * so the 'sib' form gets generated)
193        * 
194        * this sequence is used to get the address of the return
195        * buffer for a function that returns a structure
196        */
197       int pos;
198       unsigned char buf[4];
199       static unsigned char proto1[3] = { 0x87,0x04,0x24 };
200       static unsigned char proto2[4] = { 0x87,0x44,0x24,0x00 };
201       pos = codestream_tell ();
202       codestream_read (buf, 4);
203       if (memcmp (buf, proto1, 3) == 0)
204         pos += 3;
205       else if (memcmp (buf, proto2, 4) == 0)
206         pos += 4;
207
208       codestream_seek (pos);
209       op = codestream_get (); /* update next opcode */
210     }
211
212   if (op == 0x55)               /* pushl %ebp */
213     {                   
214       /* check for movl %esp, %ebp - can be written two ways */
215       switch (codestream_get ())
216         {
217         case 0x8b:
218           if (codestream_get () != 0xec)
219             return (-1);
220           break;
221         case 0x89:
222           if (codestream_get () != 0xe5)
223             return (-1);
224           break;
225         default:
226           return (-1);
227         }
228       /* check for stack adjustment 
229        *
230        *  subl $XXX, %esp
231        *
232        * note: you can't subtract a 16 bit immediate
233        * from a 32 bit reg, so we don't have to worry
234        * about a data16 prefix 
235        */
236       op = codestream_peek ();
237       if (op == 0x83)
238         {
239           /* subl with 8 bit immed */
240           codestream_get ();
241           if (codestream_get () != 0xec)
242             /* Some instruction starting with 0x83 other than subl.  */
243             {
244               codestream_seek (codestream_tell () - 2);
245               return 0;
246             }
247           /* subl with signed byte immediate 
248            * (though it wouldn't make sense to be negative)
249            */
250           return (codestream_get());
251         }
252       else if (op == 0x81)
253         {
254           char buf[4];
255           /* Maybe it is subl with 32 bit immedediate.  */
256           codestream_get();
257           if (codestream_get () != 0xec)
258             /* Some instruction starting with 0x81 other than subl.  */
259             {
260               codestream_seek (codestream_tell () - 2);
261               return 0;
262             }
263           /* It is subl with 32 bit immediate.  */
264           codestream_read ((unsigned char *)buf, 4);
265           return extract_signed_integer (buf, 4);
266         }
267       else
268         {
269           return (0);
270         }
271     }
272   else if (op == 0xc8)
273     {
274       char buf[2];
275       /* enter instruction: arg is 16 bit unsigned immed */
276       codestream_read ((unsigned char *)buf, 2);
277       codestream_get (); /* flush final byte of enter instruction */
278       return extract_unsigned_integer (buf, 2);
279     }
280   return (-1);
281 }
282
283 /* Return number of args passed to a frame.
284    Can return -1, meaning no way to tell.  */
285
286 int
287 i386_frame_num_args (fi)
288      struct frame_info *fi;
289 {
290 #if 1
291   return -1;
292 #else
293   /* This loses because not only might the compiler not be popping the
294      args right after the function call, it might be popping args from both
295      this call and a previous one, and we would say there are more args
296      than there really are.  */
297
298   int retpc;                                            
299   unsigned char op;                                     
300   struct frame_info *pfi;
301
302   /* on the 386, the instruction following the call could be:
303      popl %ecx        -  one arg
304      addl $imm, %esp  -  imm/4 args; imm may be 8 or 32 bits
305      anything else    -  zero args  */
306
307   int frameless;
308
309   FRAMELESS_FUNCTION_INVOCATION (fi, frameless);
310   if (frameless)
311     /* In the absence of a frame pointer, GDB doesn't get correct values
312        for nameless arguments.  Return -1, so it doesn't print any
313        nameless arguments.  */
314     return -1;
315
316   pfi = get_prev_frame_info (fi);                       
317   if (pfi == 0)
318     {
319       /* Note:  this can happen if we are looking at the frame for
320          main, because FRAME_CHAIN_VALID won't let us go into
321          start.  If we have debugging symbols, that's not really
322          a big deal; it just means it will only show as many arguments
323          to main as are declared.  */
324       return -1;
325     }
326   else
327     {
328       retpc = pfi->pc;                                  
329       op = read_memory_integer (retpc, 1);                      
330       if (op == 0x59)                                   
331         /* pop %ecx */                         
332         return 1;                               
333       else if (op == 0x83)
334         {
335           op = read_memory_integer (retpc+1, 1);        
336           if (op == 0xc4)                               
337             /* addl $<signed imm 8 bits>, %esp */       
338             return (read_memory_integer (retpc+2,1)&0xff)/4;
339           else
340             return 0;
341         }
342       else if (op == 0x81)
343         { /* add with 32 bit immediate */
344           op = read_memory_integer (retpc+1, 1);        
345           if (op == 0xc4)                               
346             /* addl $<imm 32>, %esp */          
347             return read_memory_integer (retpc+2, 4) / 4;
348           else
349             return 0;
350         }
351       else
352         {
353           return 0;
354         }
355     }
356 #endif
357 }
358
359 /*
360  * parse the first few instructions of the function to see
361  * what registers were stored.
362  *
363  * We handle these cases:
364  *
365  * The startup sequence can be at the start of the function,
366  * or the function can start with a branch to startup code at the end.
367  *
368  * %ebp can be set up with either the 'enter' instruction, or 
369  * 'pushl %ebp, movl %esp, %ebp' (enter is too slow to be useful,
370  * but was once used in the sys5 compiler)
371  *
372  * Local space is allocated just below the saved %ebp by either the
373  * 'enter' instruction, or by 'subl $<size>, %esp'.  'enter' has
374  * a 16 bit unsigned argument for space to allocate, and the
375  * 'addl' instruction could have either a signed byte, or
376  * 32 bit immediate.
377  *
378  * Next, the registers used by this function are pushed.  In
379  * the sys5 compiler they will always be in the order: %edi, %esi, %ebx
380  * (and sometimes a harmless bug causes it to also save but not restore %eax);
381  * however, the code below is willing to see the pushes in any order,
382  * and will handle up to 8 of them.
383  *
384  * If the setup sequence is at the end of the function, then the
385  * next instruction will be a branch back to the start.
386  */
387
388 void
389 i386_frame_find_saved_regs (fip, fsrp)
390      struct frame_info *fip;
391      struct frame_saved_regs *fsrp;
392 {
393   long locals;
394   unsigned char op;
395   CORE_ADDR dummy_bottom;
396   CORE_ADDR adr;
397   int i;
398   
399   memset (fsrp, 0, sizeof *fsrp);
400   
401   /* if frame is the end of a dummy, compute where the
402    * beginning would be
403    */
404   dummy_bottom = fip->frame - 4 - REGISTER_BYTES - CALL_DUMMY_LENGTH;
405   
406   /* check if the PC is in the stack, in a dummy frame */
407   if (dummy_bottom <= fip->pc && fip->pc <= fip->frame) 
408     {
409       /* all regs were saved by push_call_dummy () */
410       adr = fip->frame;
411       for (i = 0; i < NUM_REGS; i++) 
412         {
413           adr -= REGISTER_RAW_SIZE (i);
414           fsrp->regs[i] = adr;
415         }
416       return;
417     }
418   
419   locals = i386_get_frame_setup (get_pc_function_start (fip->pc));
420   
421   if (locals >= 0) 
422     {
423       adr = fip->frame - 4 - locals;
424       for (i = 0; i < 8; i++) 
425         {
426           op = codestream_get ();
427           if (op < 0x50 || op > 0x57)
428             break;
429 #ifdef I386_REGNO_TO_SYMMETRY
430           /* Dynix uses different internal numbering.  Ick.  */
431           fsrp->regs[I386_REGNO_TO_SYMMETRY(op - 0x50)] = adr;
432 #else
433           fsrp->regs[op - 0x50] = adr;
434 #endif
435           adr -= 4;
436         }
437     }
438   
439   fsrp->regs[PC_REGNUM] = fip->frame + 4;
440   fsrp->regs[FP_REGNUM] = fip->frame;
441 }
442
443 /* return pc of first real instruction */
444
445 int
446 i386_skip_prologue (pc)
447      int pc;
448 {
449   unsigned char op;
450   int i;
451   static unsigned char pic_pat[6] = { 0xe8, 0, 0, 0, 0, /* call   0x0 */
452                                       0x5b,             /* popl   %ebx */
453                                     };
454   CORE_ADDR pos;
455   
456   if (i386_get_frame_setup (pc) < 0)
457     return (pc);
458   
459   /* found valid frame setup - codestream now points to 
460    * start of push instructions for saving registers
461    */
462   
463   /* skip over register saves */
464   for (i = 0; i < 8; i++)
465     {
466       op = codestream_peek ();
467       /* break if not pushl inst */
468       if (op < 0x50 || op > 0x57) 
469         break;
470       codestream_get ();
471     }
472
473   /* The native cc on SVR4 in -K PIC mode inserts the following code to get
474      the address of the global offset table (GOT) into register %ebx.
475       call      0x0
476       popl      %ebx
477       movl      %ebx,x(%ebp)    (optional)
478       addl      y,%ebx
479      This code is with the rest of the prologue (at the end of the
480      function), so we have to skip it to get to the first real
481      instruction at the start of the function.  */
482      
483   pos = codestream_tell ();
484   for (i = 0; i < 6; i++)
485     {
486       op = codestream_get ();
487       if (pic_pat [i] != op)
488         break;
489     }
490   if (i == 6)
491     {
492       unsigned char buf[4];
493       long delta = 6;
494
495       op = codestream_get ();
496       if (op == 0x89)                   /* movl %ebx, x(%ebp) */
497         {
498           op = codestream_get ();
499           if (op == 0x5d)               /* one byte offset from %ebp */
500             {
501               delta += 3;
502               codestream_read (buf, 1);
503             }
504           else if (op == 0x9d)          /* four byte offset from %ebp */
505             {
506               delta += 6;
507               codestream_read (buf, 4);
508             }
509           else                          /* unexpected instruction */
510               delta = -1;
511           op = codestream_get ();
512         }
513                                         /* addl y,%ebx */
514       if (delta > 0 && op == 0x81 && codestream_get () == 0xc3) 
515         {
516             pos += delta + 6;
517         }
518     }
519   codestream_seek (pos);
520   
521   i386_follow_jump ();
522   
523   return (codestream_tell ());
524 }
525
526 void
527 i386_push_dummy_frame ()
528 {
529   CORE_ADDR sp = read_register (SP_REGNUM);
530   int regnum;
531   char regbuf[MAX_REGISTER_RAW_SIZE];
532   
533   sp = push_word (sp, read_register (PC_REGNUM));
534   sp = push_word (sp, read_register (FP_REGNUM));
535   write_register (FP_REGNUM, sp);
536   for (regnum = 0; regnum < NUM_REGS; regnum++)
537     {
538       read_register_gen (regnum, regbuf);
539       sp = push_bytes (sp, regbuf, REGISTER_RAW_SIZE (regnum));
540     }
541   write_register (SP_REGNUM, sp);
542 }
543
544 void
545 i386_pop_frame ()
546 {
547   struct frame_info *frame = get_current_frame ();
548   CORE_ADDR fp;
549   int regnum;
550   struct frame_saved_regs fsr;
551   char regbuf[MAX_REGISTER_RAW_SIZE];
552   
553   fp = FRAME_FP (frame);
554   get_frame_saved_regs (frame, &fsr);
555   for (regnum = 0; regnum < NUM_REGS; regnum++) 
556     {
557       CORE_ADDR adr;
558       adr = fsr.regs[regnum];
559       if (adr)
560         {
561           read_memory (adr, regbuf, REGISTER_RAW_SIZE (regnum));
562           write_register_bytes (REGISTER_BYTE (regnum), regbuf,
563                                 REGISTER_RAW_SIZE (regnum));
564         }
565     }
566   write_register (FP_REGNUM, read_memory_integer (fp, 4));
567   write_register (PC_REGNUM, read_memory_integer (fp + 4, 4));
568   write_register (SP_REGNUM, fp + 8);
569   flush_cached_frames ();
570 }
571
572 #ifdef GET_LONGJMP_TARGET
573
574 /* Figure out where the longjmp will land.  Slurp the args out of the stack.
575    We expect the first arg to be a pointer to the jmp_buf structure from which
576    we extract the pc (JB_PC) that we will land at.  The pc is copied into PC.
577    This routine returns true on success. */
578
579 int
580 get_longjmp_target(pc)
581      CORE_ADDR *pc;
582 {
583   char buf[TARGET_PTR_BIT / TARGET_CHAR_BIT];
584   CORE_ADDR sp, jb_addr;
585
586   sp = read_register (SP_REGNUM);
587
588   if (target_read_memory (sp + SP_ARG0, /* Offset of first arg on stack */
589                           buf,
590                           TARGET_PTR_BIT / TARGET_CHAR_BIT))
591     return 0;
592
593   jb_addr = extract_address (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT);
594
595   if (target_read_memory (jb_addr + JB_PC * JB_ELEMENT_SIZE, buf,
596                           TARGET_PTR_BIT / TARGET_CHAR_BIT))
597     return 0;
598
599   *pc = extract_address (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT);
600
601   return 1;
602 }
603
604 #endif /* GET_LONGJMP_TARGET */
605
606 void
607 i386_extract_return_value(type, regbuf, valbuf)
608      struct type *type;
609      char regbuf[REGISTER_BYTES];
610      char *valbuf;
611 {
612 /* On AIX, floating point values are returned in floating point registers.  */
613 #ifdef I386_AIX_TARGET
614   if (TYPE_CODE_FLT == TYPE_CODE(type))
615     {
616       double d;
617       /* 387 %st(0), gcc uses this */
618       floatformat_to_double (&floatformat_i387_ext,
619                              &regbuf[REGISTER_BYTE(FP0_REGNUM)],
620                              &d);
621       store_floating (valbuf, TYPE_LENGTH (type), d);
622     }
623   else
624 #endif /* I386_AIX_TARGET */
625     { 
626       memcpy (valbuf, regbuf, TYPE_LENGTH (type)); 
627     }
628 }
629
630 #ifdef I386V4_SIGTRAMP_SAVED_PC
631 /* Get saved user PC for sigtramp from the pushed ucontext on the stack
632    for all three variants of SVR4 sigtramps.  */
633
634 CORE_ADDR
635 i386v4_sigtramp_saved_pc (frame)
636      struct frame_info *frame;
637 {
638   CORE_ADDR saved_pc_offset = 4;
639   char *name = NULL;
640
641   find_pc_partial_function (frame->pc, &name, NULL, NULL);
642   if (name)
643     {
644       if (STREQ (name, "_sigreturn"))
645         saved_pc_offset = 132 + 14 * 4;
646       else if (STREQ (name, "_sigacthandler"))
647         saved_pc_offset = 80 + 14 * 4;
648       else if (STREQ (name, "sigvechandler"))
649         saved_pc_offset = 120 + 14 * 4;
650     }
651
652   if (frame->next)
653     return read_memory_integer (frame->next->frame + saved_pc_offset, 4);
654   return read_memory_integer (read_register (SP_REGNUM) + saved_pc_offset, 4);
655 }
656 #endif /* I386V4_SIGTRAMP_SAVED_PC */
657
658
659
660 /* Stuff for WIN32 PE style DLL's but is pretty generic really. */
661
662 CORE_ADDR
663 skip_trampoline_code (pc, name)
664      CORE_ADDR pc;
665      char *name;
666 {
667   if (pc && read_memory_unsigned_integer (pc, 2) == 0x25ff) /* jmp *(dest) */
668     {
669       unsigned long indirect = read_memory_unsigned_integer (pc+2, 4);
670       struct minimal_symbol *indsym =
671         indirect ? lookup_minimal_symbol_by_pc (indirect) : 0;
672       char *symname = indsym ? SYMBOL_NAME(indsym) : 0;
673
674       if (symname) 
675         {
676           if (strncmp (symname,"__imp_", 6) == 0
677               || strncmp (symname,"_imp_", 5) == 0)
678             return name ? 1 : read_memory_unsigned_integer (indirect, 4);
679         }
680     }
681   return 0;                     /* not a trampoline */
682 }
683
684 void
685 _initialize_i386_tdep ()
686 {
687   tm_print_insn = print_insn_i386;
688 }