1 /* Intel 386 target-dependent stuff.
2 Copyright (C) 1988, 1989, 1991 Free Software Foundation, Inc.
4 This file is part of GDB.
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.
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.
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., 675 Mass Ave, Cambridge, MA 02139, USA. */
27 i386_get_frame_setup PARAMS ((int));
30 i386_follow_jump PARAMS ((void));
33 codestream_read PARAMS ((unsigned char *, int));
36 codestream_seek PARAMS ((int));
39 codestream_fill PARAMS ((int));
41 /* helper functions for tm-i386.h */
43 /* Stdio style buffering was used to minimize calls to ptrace, but this
44 buffering did not take into account that the code section being accessed
45 may not be an even number of buffers long (even if the buffer is only
46 sizeof(int) long). In cases where the code section size happened to
47 be a non-integral number of buffers long, attempting to read the last
48 buffer would fail. Simply using target_read_memory and ignoring errors,
49 rather than read_memory, is not the correct solution, since legitimate
50 access errors would then be totally ignored. To properly handle this
51 situation and continue to use buffering would require that this code
52 be able to determine the minimum code section size granularity (not the
53 alignment of the section itself, since the actual failing case that
54 pointed out this problem had a section alignment of 4 but was not a
55 multiple of 4 bytes long), on a target by target basis, and then
56 adjust it's buffer size accordingly. This is messy, but potentially
57 feasible. It probably needs the bfd library's help and support. For
58 now, the buffer size is set to 1. (FIXME -fnf) */
60 #define CODESTREAM_BUFSIZ 1 /* Was sizeof(int), see note above. */
61 static CORE_ADDR codestream_next_addr;
62 static CORE_ADDR codestream_addr;
63 static unsigned char codestream_buf[CODESTREAM_BUFSIZ];
64 static int codestream_off;
65 static int codestream_cnt;
67 #define codestream_tell() (codestream_addr + codestream_off)
68 #define codestream_peek() (codestream_cnt == 0 ? \
69 codestream_fill(1): codestream_buf[codestream_off])
70 #define codestream_get() (codestream_cnt-- == 0 ? \
71 codestream_fill(0) : codestream_buf[codestream_off++])
74 codestream_fill (peek_flag)
77 codestream_addr = codestream_next_addr;
78 codestream_next_addr += CODESTREAM_BUFSIZ;
80 codestream_cnt = CODESTREAM_BUFSIZ;
81 read_memory (codestream_addr, (char *) codestream_buf, CODESTREAM_BUFSIZ);
84 return (codestream_peek());
86 return (codestream_get());
90 codestream_seek (place)
93 codestream_next_addr = place / CODESTREAM_BUFSIZ;
94 codestream_next_addr *= CODESTREAM_BUFSIZ;
97 while (codestream_tell() != place)
102 codestream_read (buf, count)
109 for (i = 0; i < count; i++)
110 *p++ = codestream_get ();
113 /* next instruction is a jump, move to target */
124 pos = codestream_tell ();
127 if (codestream_peek () == 0x66)
133 switch (codestream_get ())
136 /* relative jump: if data16 == 0, disp32, else disp16 */
139 codestream_read ((unsigned char *)&short_delta, 2);
141 /* include size of jmp inst (including the 0x66 prefix). */
142 pos += short_delta + 4;
146 codestream_read ((unsigned char *)&long_delta, 4);
147 pos += long_delta + 5;
151 /* relative jump, disp8 (ignore data16) */
152 codestream_read ((unsigned char *)&byte_delta, 1);
153 pos += byte_delta + 2;
156 codestream_seek (pos);
160 * find & return amound a local space allocated, and advance codestream to
161 * first register push (if any)
163 * if entry sequence doesn't make sense, return -1, and leave
164 * codestream pointer random
168 i386_get_frame_setup (pc)
173 codestream_seek (pc);
177 op = codestream_get ();
179 if (op == 0x58) /* popl %eax */
182 * this function must start with
185 * xchgl %eax, (%esp) 0x87 0x04 0x24
186 * or xchgl %eax, 0(%esp) 0x87 0x44 0x24 0x00
188 * (the system 5 compiler puts out the second xchg
189 * inst, and the assembler doesn't try to optimize it,
190 * so the 'sib' form gets generated)
192 * this sequence is used to get the address of the return
193 * buffer for a function that returns a structure
196 unsigned char buf[4];
197 static unsigned char proto1[3] = { 0x87,0x04,0x24 };
198 static unsigned char proto2[4] = { 0x87,0x44,0x24,0x00 };
199 pos = codestream_tell ();
200 codestream_read (buf, 4);
201 if (memcmp (buf, proto1, 3) == 0)
203 else if (memcmp (buf, proto2, 4) == 0)
206 codestream_seek (pos);
207 op = codestream_get (); /* update next opcode */
210 if (op == 0x55) /* pushl %ebp */
212 /* check for movl %esp, %ebp - can be written two ways */
213 switch (codestream_get ())
216 if (codestream_get () != 0xec)
220 if (codestream_get () != 0xe5)
226 /* check for stack adjustment
230 * note: you can't subtract a 16 bit immediate
231 * from a 32 bit reg, so we don't have to worry
232 * about a data16 prefix
234 op = codestream_peek ();
237 /* subl with 8 bit immed */
239 if (codestream_get () != 0xec)
240 /* Some instruction starting with 0x83 other than subl. */
242 codestream_seek (codestream_tell () - 2);
245 /* subl with signed byte immediate
246 * (though it wouldn't make sense to be negative)
248 return (codestream_get());
253 /* Maybe it is subl with 32 bit immedediate. */
255 if (codestream_get () != 0xec)
256 /* Some instruction starting with 0x81 other than subl. */
258 codestream_seek (codestream_tell () - 2);
261 /* It is subl with 32 bit immediate. */
262 codestream_read ((unsigned char *)buf, 4);
263 return extract_signed_integer (buf, 4);
273 /* enter instruction: arg is 16 bit unsigned immed */
274 codestream_read ((unsigned char *)buf, 2);
275 codestream_get (); /* flush final byte of enter instruction */
276 return extract_unsigned_integer (buf, 2);
281 /* Return number of args passed to a frame.
282 Can return -1, meaning no way to tell. */
285 i386_frame_num_args (fi)
286 struct frame_info *fi;
291 /* This loses because not only might the compiler not be popping the
292 args right after the function call, it might be popping args from both
293 this call and a previous one, and we would say there are more args
294 than there really are. */
298 struct frame_info *pfi;
300 /* on the 386, the instruction following the call could be:
302 addl $imm, %esp - imm/4 args; imm may be 8 or 32 bits
303 anything else - zero args */
307 FRAMELESS_FUNCTION_INVOCATION (fi, frameless);
309 /* In the absence of a frame pointer, GDB doesn't get correct values
310 for nameless arguments. Return -1, so it doesn't print any
311 nameless arguments. */
314 pfi = get_prev_frame_info (fi);
317 /* Note: this can happen if we are looking at the frame for
318 main, because FRAME_CHAIN_VALID won't let us go into
319 start. If we have debugging symbols, that's not really
320 a big deal; it just means it will only show as many arguments
321 to main as are declared. */
327 op = read_memory_integer (retpc, 1);
333 op = read_memory_integer (retpc+1, 1);
335 /* addl $<signed imm 8 bits>, %esp */
336 return (read_memory_integer (retpc+2,1)&0xff)/4;
341 { /* add with 32 bit immediate */
342 op = read_memory_integer (retpc+1, 1);
344 /* addl $<imm 32>, %esp */
345 return read_memory_integer (retpc+2, 4) / 4;
358 * parse the first few instructions of the function to see
359 * what registers were stored.
361 * We handle these cases:
363 * The startup sequence can be at the start of the function,
364 * or the function can start with a branch to startup code at the end.
366 * %ebp can be set up with either the 'enter' instruction, or
367 * 'pushl %ebp, movl %esp, %ebp' (enter is too slow to be useful,
368 * but was once used in the sys5 compiler)
370 * Local space is allocated just below the saved %ebp by either the
371 * 'enter' instruction, or by 'subl $<size>, %esp'. 'enter' has
372 * a 16 bit unsigned argument for space to allocate, and the
373 * 'addl' instruction could have either a signed byte, or
376 * Next, the registers used by this function are pushed. In
377 * the sys5 compiler they will always be in the order: %edi, %esi, %ebx
378 * (and sometimes a harmless bug causes it to also save but not restore %eax);
379 * however, the code below is willing to see the pushes in any order,
380 * and will handle up to 8 of them.
382 * If the setup sequence is at the end of the function, then the
383 * next instruction will be a branch back to the start.
387 i386_frame_find_saved_regs (fip, fsrp)
388 struct frame_info *fip;
389 struct frame_saved_regs *fsrp;
393 CORE_ADDR dummy_bottom;
397 memset (fsrp, 0, sizeof *fsrp);
399 /* if frame is the end of a dummy, compute where the
402 dummy_bottom = fip->frame - 4 - REGISTER_BYTES - CALL_DUMMY_LENGTH;
404 /* check if the PC is in the stack, in a dummy frame */
405 if (dummy_bottom <= fip->pc && fip->pc <= fip->frame)
407 /* all regs were saved by push_call_dummy () */
409 for (i = 0; i < NUM_REGS; i++)
411 adr -= REGISTER_RAW_SIZE (i);
417 locals = i386_get_frame_setup (get_pc_function_start (fip->pc));
421 adr = fip->frame - 4 - locals;
422 for (i = 0; i < 8; i++)
424 op = codestream_get ();
425 if (op < 0x50 || op > 0x57)
427 fsrp->regs[op - 0x50] = adr;
432 fsrp->regs[PC_REGNUM] = fip->frame + 4;
433 fsrp->regs[FP_REGNUM] = fip->frame;
436 /* return pc of first real instruction */
439 i386_skip_prologue (pc)
445 if (i386_get_frame_setup (pc) < 0)
448 /* found valid frame setup - codestream now points to
449 * start of push instructions for saving registers
452 /* skip over register saves */
453 for (i = 0; i < 8; i++)
455 op = codestream_peek ();
456 /* break if not pushl inst */
457 if (op < 0x50 || op > 0x57)
464 return (codestream_tell ());
468 i386_push_dummy_frame ()
470 CORE_ADDR sp = read_register (SP_REGNUM);
472 char regbuf[MAX_REGISTER_RAW_SIZE];
474 sp = push_word (sp, read_register (PC_REGNUM));
475 sp = push_word (sp, read_register (FP_REGNUM));
476 write_register (FP_REGNUM, sp);
477 for (regnum = 0; regnum < NUM_REGS; regnum++)
479 read_register_gen (regnum, regbuf);
480 sp = push_bytes (sp, regbuf, REGISTER_RAW_SIZE (regnum));
482 write_register (SP_REGNUM, sp);
488 FRAME frame = get_current_frame ();
491 struct frame_saved_regs fsr;
492 struct frame_info *fi;
493 char regbuf[MAX_REGISTER_RAW_SIZE];
495 fi = get_frame_info (frame);
497 get_frame_saved_regs (fi, &fsr);
498 for (regnum = 0; regnum < NUM_REGS; regnum++)
501 adr = fsr.regs[regnum];
504 read_memory (adr, regbuf, REGISTER_RAW_SIZE (regnum));
505 write_register_bytes (REGISTER_BYTE (regnum), regbuf,
506 REGISTER_RAW_SIZE (regnum));
509 write_register (FP_REGNUM, read_memory_integer (fp, 4));
510 write_register (PC_REGNUM, read_memory_integer (fp + 4, 4));
511 write_register (SP_REGNUM, fp + 8);
512 flush_cached_frames ();
513 set_current_frame ( create_new_frame (read_register (FP_REGNUM),
517 #ifdef GET_LONGJMP_TARGET
519 /* Figure out where the longjmp will land. Slurp the args out of the stack.
520 We expect the first arg to be a pointer to the jmp_buf structure from which
521 we extract the pc (JB_PC) that we will land at. The pc is copied into PC.
522 This routine returns true on success. */
525 get_longjmp_target(pc)
528 char buf[TARGET_PTR_BIT / TARGET_CHAR_BIT];
529 CORE_ADDR sp, jb_addr;
531 sp = read_register (SP_REGNUM);
533 if (target_read_memory (sp + SP_ARG0, /* Offset of first arg on stack */
535 TARGET_PTR_BIT / TARGET_CHAR_BIT))
538 jb_addr = extract_address (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT);
540 if (target_read_memory (jb_addr + JB_PC * JB_ELEMENT_SIZE, buf,
541 TARGET_PTR_BIT / TARGET_CHAR_BIT))
544 *pc = extract_address (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT);
549 #endif /* GET_LONGJMP_TARGET */
551 #ifdef I386_AIX_TARGET
552 /* On AIX, floating point values are returned in floating point registers. */
555 i386_extract_return_value(type, regbuf, valbuf)
557 char regbuf[REGISTER_BYTES];
560 if (TYPE_CODE_FLT == TYPE_CODE(type))
562 extern struct ext_format ext_format_i387;
564 /* 387 %st(0), gcc uses this */
565 ieee_extended_to_double (&ext_format_i387,
566 ®buf[REGISTER_BYTE(FP0_REGNUM)],
568 switch (TYPE_LENGTH(type))
573 memcpy (valbuf, &f, 4);
577 memcpy (valbuf, &d, 8);
580 error("Unknown floating point size");
586 memcpy (valbuf, regbuf, TYPE_LENGTH (type));
589 #endif /* I386_AIX_TARGET */