| OLD | NEW |
| 1 /* Native debugging support for Intel x86 running DJGPP. | 1 /* Native debugging support for Intel x86 running DJGPP. |
| 2 Copyright (C) 1997, 1999-2001, 2005-2012 Free Software Foundation, | 2 Copyright (C) 1997, 1999-2001, 2005-2012 Free Software Foundation, |
| 3 Inc. | 3 Inc. |
| 4 Written by Robert Hoehne. | 4 Written by Robert Hoehne. |
| 5 | 5 |
| 6 This file is part of GDB. | 6 This file is part of GDB. |
| 7 | 7 |
| 8 This program is free software; you can redistribute it and/or modify | 8 This program is free software; you can redistribute it and/or modify |
| 9 it under the terms of the GNU General Public License as published by | 9 it under the terms of the GNU General Public License as published by |
| 10 the Free Software Foundation; either version 3 of the License, or | 10 the Free Software Foundation; either version 3 of the License, or |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 231 | 231 |
| 232 #define SOME_PID 42 | 232 #define SOME_PID 42 |
| 233 | 233 |
| 234 static int prog_has_started = 0; | 234 static int prog_has_started = 0; |
| 235 static void go32_open (char *name, int from_tty); | 235 static void go32_open (char *name, int from_tty); |
| 236 static void go32_close (int quitting); | 236 static void go32_close (int quitting); |
| 237 static void go32_attach (struct target_ops *ops, char *args, int from_tty); | 237 static void go32_attach (struct target_ops *ops, char *args, int from_tty); |
| 238 static void go32_detach (struct target_ops *ops, char *args, int from_tty); | 238 static void go32_detach (struct target_ops *ops, char *args, int from_tty); |
| 239 static void go32_resume (struct target_ops *ops, | 239 static void go32_resume (struct target_ops *ops, |
| 240 ptid_t ptid, int step, | 240 ptid_t ptid, int step, |
| 241 » » » enum target_signal siggnal); | 241 » » » enum gdb_signal siggnal); |
| 242 static void go32_fetch_registers (struct target_ops *ops, | 242 static void go32_fetch_registers (struct target_ops *ops, |
| 243 struct regcache *, int regno); | 243 struct regcache *, int regno); |
| 244 static void store_register (const struct regcache *, int regno); | 244 static void store_register (const struct regcache *, int regno); |
| 245 static void go32_store_registers (struct target_ops *ops, | 245 static void go32_store_registers (struct target_ops *ops, |
| 246 struct regcache *, int regno); | 246 struct regcache *, int regno); |
| 247 static void go32_prepare_to_store (struct regcache *); | 247 static void go32_prepare_to_store (struct regcache *); |
| 248 static int go32_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, | 248 static int go32_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, |
| 249 int write, | 249 int write, |
| 250 struct mem_attrib *attrib, | 250 struct mem_attrib *attrib, |
| 251 struct target_ops *target); | 251 struct target_ops *target); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 302 {16, 2}, /* last FP exception CS from npx */ | 302 {16, 2}, /* last FP exception CS from npx */ |
| 303 {12, 4}, /* last FP exception EIP from npx */ | 303 {12, 4}, /* last FP exception EIP from npx */ |
| 304 {24, 2}, /* last FP exception operand selector from npx */ | 304 {24, 2}, /* last FP exception operand selector from npx */ |
| 305 {20, 4}, /* last FP exception operand offset from npx */ | 305 {20, 4}, /* last FP exception operand offset from npx */ |
| 306 {18, 2} /* last FP opcode from npx */ | 306 {18, 2} /* last FP opcode from npx */ |
| 307 }; | 307 }; |
| 308 | 308 |
| 309 static struct | 309 static struct |
| 310 { | 310 { |
| 311 int go32_sig; | 311 int go32_sig; |
| 312 enum target_signal gdb_sig; | 312 enum gdb_signal gdb_sig; |
| 313 } | 313 } |
| 314 sig_map[] = | 314 sig_map[] = |
| 315 { | 315 { |
| 316 {0, TARGET_SIGNAL_FPE}, | 316 {0, GDB_SIGNAL_FPE}, |
| 317 {1, TARGET_SIGNAL_TRAP}, | 317 {1, GDB_SIGNAL_TRAP}, |
| 318 /* Exception 2 is triggered by the NMI. DJGPP handles it as SIGILL, | 318 /* Exception 2 is triggered by the NMI. DJGPP handles it as SIGILL, |
| 319 but I think SIGBUS is better, since the NMI is usually activated | 319 but I think SIGBUS is better, since the NMI is usually activated |
| 320 as a result of a memory parity check failure. */ | 320 as a result of a memory parity check failure. */ |
| 321 {2, TARGET_SIGNAL_BUS}, | 321 {2, GDB_SIGNAL_BUS}, |
| 322 {3, TARGET_SIGNAL_TRAP}, | 322 {3, GDB_SIGNAL_TRAP}, |
| 323 {4, TARGET_SIGNAL_FPE}, | 323 {4, GDB_SIGNAL_FPE}, |
| 324 {5, TARGET_SIGNAL_SEGV}, | 324 {5, GDB_SIGNAL_SEGV}, |
| 325 {6, TARGET_SIGNAL_ILL}, | 325 {6, GDB_SIGNAL_ILL}, |
| 326 {7, TARGET_SIGNAL_EMT},» /* no-coprocessor exception */ | 326 {7, GDB_SIGNAL_EMT},» /* no-coprocessor exception */ |
| 327 {8, TARGET_SIGNAL_SEGV}, | 327 {8, GDB_SIGNAL_SEGV}, |
| 328 {9, TARGET_SIGNAL_SEGV}, | 328 {9, GDB_SIGNAL_SEGV}, |
| 329 {10, TARGET_SIGNAL_BUS}, | 329 {10, GDB_SIGNAL_BUS}, |
| 330 {11, TARGET_SIGNAL_SEGV}, | 330 {11, GDB_SIGNAL_SEGV}, |
| 331 {12, TARGET_SIGNAL_SEGV}, | 331 {12, GDB_SIGNAL_SEGV}, |
| 332 {13, TARGET_SIGNAL_SEGV}, | 332 {13, GDB_SIGNAL_SEGV}, |
| 333 {14, TARGET_SIGNAL_SEGV}, | 333 {14, GDB_SIGNAL_SEGV}, |
| 334 {16, TARGET_SIGNAL_FPE}, | 334 {16, GDB_SIGNAL_FPE}, |
| 335 {17, TARGET_SIGNAL_BUS}, | 335 {17, GDB_SIGNAL_BUS}, |
| 336 {31, TARGET_SIGNAL_ILL}, | 336 {31, GDB_SIGNAL_ILL}, |
| 337 {0x1b, TARGET_SIGNAL_INT}, | 337 {0x1b, GDB_SIGNAL_INT}, |
| 338 {0x75, TARGET_SIGNAL_FPE}, | 338 {0x75, GDB_SIGNAL_FPE}, |
| 339 {0x78, TARGET_SIGNAL_ALRM}, | 339 {0x78, GDB_SIGNAL_ALRM}, |
| 340 {0x79, TARGET_SIGNAL_INT}, | 340 {0x79, GDB_SIGNAL_INT}, |
| 341 {0x7a, TARGET_SIGNAL_QUIT}, | 341 {0x7a, GDB_SIGNAL_QUIT}, |
| 342 {-1, TARGET_SIGNAL_LAST} | 342 {-1, GDB_SIGNAL_LAST} |
| 343 }; | 343 }; |
| 344 | 344 |
| 345 static struct { | 345 static struct { |
| 346 enum target_signal gdb_sig; | 346 enum gdb_signal gdb_sig; |
| 347 int djgpp_excepno; | 347 int djgpp_excepno; |
| 348 } excepn_map[] = { | 348 } excepn_map[] = { |
| 349 {TARGET_SIGNAL_0, -1}, | 349 {GDB_SIGNAL_0, -1}, |
| 350 {TARGET_SIGNAL_ILL, 6},» /* Invalid Opcode */ | 350 {GDB_SIGNAL_ILL, 6},» /* Invalid Opcode */ |
| 351 {TARGET_SIGNAL_EMT, 7},» /* triggers SIGNOFP */ | 351 {GDB_SIGNAL_EMT, 7},» /* triggers SIGNOFP */ |
| 352 {TARGET_SIGNAL_SEGV, 13},» /* GPF */ | 352 {GDB_SIGNAL_SEGV, 13},» /* GPF */ |
| 353 {TARGET_SIGNAL_BUS, 17},» /* Alignment Check */ | 353 {GDB_SIGNAL_BUS, 17},»/* Alignment Check */ |
| 354 /* The rest are fake exceptions, see dpmiexcp.c in djlsr*.zip for | 354 /* The rest are fake exceptions, see dpmiexcp.c in djlsr*.zip for |
| 355 details. */ | 355 details. */ |
| 356 {TARGET_SIGNAL_TERM, 0x1b},» /* triggers Ctrl-Break type of SIGINT */ | 356 {GDB_SIGNAL_TERM, 0x1b},» /* triggers Ctrl-Break type of SIGINT */ |
| 357 {TARGET_SIGNAL_FPE, 0x75}, | 357 {GDB_SIGNAL_FPE, 0x75}, |
| 358 {TARGET_SIGNAL_INT, 0x79}, | 358 {GDB_SIGNAL_INT, 0x79}, |
| 359 {TARGET_SIGNAL_QUIT, 0x7a}, | 359 {GDB_SIGNAL_QUIT, 0x7a}, |
| 360 {TARGET_SIGNAL_ALRM, 0x78},» /* triggers SIGTIMR */ | 360 {GDB_SIGNAL_ALRM, 0x78},» /* triggers SIGTIMR */ |
| 361 {TARGET_SIGNAL_PROF, 0x78}, | 361 {GDB_SIGNAL_PROF, 0x78}, |
| 362 {TARGET_SIGNAL_LAST, -1} | 362 {GDB_SIGNAL_LAST, -1} |
| 363 }; | 363 }; |
| 364 | 364 |
| 365 static void | 365 static void |
| 366 go32_open (char *name, int from_tty) | 366 go32_open (char *name, int from_tty) |
| 367 { | 367 { |
| 368 printf_unfiltered ("Done. Use the \"run\" command to run the program.\n"); | 368 printf_unfiltered ("Done. Use the \"run\" command to run the program.\n"); |
| 369 } | 369 } |
| 370 | 370 |
| 371 static void | 371 static void |
| 372 go32_close (int quitting) | 372 go32_close (int quitting) |
| (...skipping 11 matching lines...) Expand all Loading... |
| 384 static void | 384 static void |
| 385 go32_detach (struct target_ops *ops, char *args, int from_tty) | 385 go32_detach (struct target_ops *ops, char *args, int from_tty) |
| 386 { | 386 { |
| 387 } | 387 } |
| 388 | 388 |
| 389 static int resume_is_step; | 389 static int resume_is_step; |
| 390 static int resume_signal = -1; | 390 static int resume_signal = -1; |
| 391 | 391 |
| 392 static void | 392 static void |
| 393 go32_resume (struct target_ops *ops, | 393 go32_resume (struct target_ops *ops, |
| 394 » ptid_t ptid, int step, enum target_signal siggnal) | 394 » ptid_t ptid, int step, enum gdb_signal siggnal) |
| 395 { | 395 { |
| 396 int i; | 396 int i; |
| 397 | 397 |
| 398 resume_is_step = step; | 398 resume_is_step = step; |
| 399 | 399 |
| 400 if (siggnal != TARGET_SIGNAL_0 && siggnal != TARGET_SIGNAL_TRAP) | 400 if (siggnal != GDB_SIGNAL_0 && siggnal != GDB_SIGNAL_TRAP) |
| 401 { | 401 { |
| 402 for (i = 0, resume_signal = -1; | 402 for (i = 0, resume_signal = -1; |
| 403 » excepn_map[i].gdb_sig != TARGET_SIGNAL_LAST; i++) | 403 » excepn_map[i].gdb_sig != GDB_SIGNAL_LAST; i++) |
| 404 if (excepn_map[i].gdb_sig == siggnal) | 404 if (excepn_map[i].gdb_sig == siggnal) |
| 405 { | 405 { |
| 406 resume_signal = excepn_map[i].djgpp_excepno; | 406 resume_signal = excepn_map[i].djgpp_excepno; |
| 407 break; | 407 break; |
| 408 } | 408 } |
| 409 if (resume_signal == -1) | 409 if (resume_signal == -1) |
| 410 printf_unfiltered ("Cannot deliver signal %s on this platform.\n", | 410 printf_unfiltered ("Cannot deliver signal %s on this platform.\n", |
| 411 » » » target_signal_to_name (siggnal)); | 411 » » » gdb_signal_to_name (siggnal)); |
| 412 } | 412 } |
| 413 } | 413 } |
| 414 | 414 |
| 415 static char child_cwd[FILENAME_MAX]; | 415 static char child_cwd[FILENAME_MAX]; |
| 416 | 416 |
| 417 static ptid_t | 417 static ptid_t |
| 418 go32_wait (struct target_ops *ops, | 418 go32_wait (struct target_ops *ops, |
| 419 ptid_t ptid, struct target_waitstatus *status, int options) | 419 ptid_t ptid, struct target_waitstatus *status, int options) |
| 420 { | 420 { |
| 421 int i; | 421 int i; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 506 getcwd (child_cwd, sizeof (child_cwd)); /* in case it has changed */ | 506 getcwd (child_cwd, sizeof (child_cwd)); /* in case it has changed */ |
| 507 chdir (current_directory); | 507 chdir (current_directory); |
| 508 | 508 |
| 509 if (a_tss.tss_irqn == 0x21) | 509 if (a_tss.tss_irqn == 0x21) |
| 510 { | 510 { |
| 511 status->kind = TARGET_WAITKIND_EXITED; | 511 status->kind = TARGET_WAITKIND_EXITED; |
| 512 status->value.integer = a_tss.tss_eax & 0xff; | 512 status->value.integer = a_tss.tss_eax & 0xff; |
| 513 } | 513 } |
| 514 else | 514 else |
| 515 { | 515 { |
| 516 status->value.sig = TARGET_SIGNAL_UNKNOWN; | 516 status->value.sig = GDB_SIGNAL_UNKNOWN; |
| 517 status->kind = TARGET_WAITKIND_STOPPED; | 517 status->kind = TARGET_WAITKIND_STOPPED; |
| 518 for (i = 0; sig_map[i].go32_sig != -1; i++) | 518 for (i = 0; sig_map[i].go32_sig != -1; i++) |
| 519 { | 519 { |
| 520 if (a_tss.tss_irqn == sig_map[i].go32_sig) | 520 if (a_tss.tss_irqn == sig_map[i].go32_sig) |
| 521 { | 521 { |
| 522 #if __DJGPP_MINOR__ < 3 | 522 #if __DJGPP_MINOR__ < 3 |
| 523 if ((status->value.sig = sig_map[i].gdb_sig) != | 523 if ((status->value.sig = sig_map[i].gdb_sig) != |
| 524 » » TARGET_SIGNAL_TRAP) | 524 » » GDB_SIGNAL_TRAP) |
| 525 status->kind = TARGET_WAITKIND_SIGNALLED; | 525 status->kind = TARGET_WAITKIND_SIGNALLED; |
| 526 #else | 526 #else |
| 527 status->value.sig = sig_map[i].gdb_sig; | 527 status->value.sig = sig_map[i].gdb_sig; |
| 528 #endif | 528 #endif |
| 529 break; | 529 break; |
| 530 } | 530 } |
| 531 } | 531 } |
| 532 } | 532 } |
| 533 return pid_to_ptid (SOME_PID); | 533 return pid_to_ptid (SOME_PID); |
| 534 } | 534 } |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 794 | 794 |
| 795 /* Get the value of the DR6 debug status register from the inferior. | 795 /* Get the value of the DR6 debug status register from the inferior. |
| 796 Here we just return the value stored in D_REGS, as we've got it | 796 Here we just return the value stored in D_REGS, as we've got it |
| 797 from the last go32_wait call. */ | 797 from the last go32_wait call. */ |
| 798 static unsigned long | 798 static unsigned long |
| 799 go32_get_dr6 (void) | 799 go32_get_dr6 (void) |
| 800 { | 800 { |
| 801 return STATUS; | 801 return STATUS; |
| 802 } | 802 } |
| 803 | 803 |
| 804 /* Get the value of the DR7 debug status register from the inferior. |
| 805 Here we just return the value stored in D_REGS, as we've got it |
| 806 from the last go32_wait call. */ |
| 807 |
| 808 static unsigned long |
| 809 go32_get_dr7 (void) |
| 810 { |
| 811 return CONTROL; |
| 812 } |
| 813 |
| 814 /* Get the value of the DR debug register I from the inferior. Here |
| 815 we just return the value stored in D_REGS, as we've got it from the |
| 816 last go32_wait call. */ |
| 817 |
| 818 static CORE_ADDR |
| 819 go32_get_dr (int i) |
| 820 { |
| 821 if (i < 0 || i > 3) |
| 822 internal_error (__FILE__, __LINE__, |
| 823 _("Invalid register %d in go32_get_dr.\n"), i); |
| 824 return D_REGS[i]; |
| 825 } |
| 826 |
| 804 /* Put the device open on handle FD into either raw or cooked | 827 /* Put the device open on handle FD into either raw or cooked |
| 805 mode, return 1 if it was in raw mode, zero otherwise. */ | 828 mode, return 1 if it was in raw mode, zero otherwise. */ |
| 806 | 829 |
| 807 static int | 830 static int |
| 808 device_mode (int fd, int raw_p) | 831 device_mode (int fd, int raw_p) |
| 809 { | 832 { |
| 810 int oldmode, newmode; | 833 int oldmode, newmode; |
| 811 __dpmi_regs regs; | 834 __dpmi_regs regs; |
| 812 | 835 |
| 813 regs.x.ax = 0x4400; | 836 regs.x.ax = 0x4400; |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 977 go32_ops.to_has_memory = default_child_has_memory; | 1000 go32_ops.to_has_memory = default_child_has_memory; |
| 978 go32_ops.to_has_stack = default_child_has_stack; | 1001 go32_ops.to_has_stack = default_child_has_stack; |
| 979 go32_ops.to_has_registers = default_child_has_registers; | 1002 go32_ops.to_has_registers = default_child_has_registers; |
| 980 go32_ops.to_has_execution = default_child_has_execution; | 1003 go32_ops.to_has_execution = default_child_has_execution; |
| 981 | 1004 |
| 982 i386_use_watchpoints (&go32_ops); | 1005 i386_use_watchpoints (&go32_ops); |
| 983 | 1006 |
| 984 | 1007 |
| 985 i386_dr_low.set_control = go32_set_dr7; | 1008 i386_dr_low.set_control = go32_set_dr7; |
| 986 i386_dr_low.set_addr = go32_set_dr; | 1009 i386_dr_low.set_addr = go32_set_dr; |
| 987 i386_dr_low.reset_addr = NULL; | |
| 988 i386_dr_low.get_status = go32_get_dr6; | 1010 i386_dr_low.get_status = go32_get_dr6; |
| 1011 i386_dr_low.get_control = go32_get_dr7; |
| 1012 i386_dr_low.get_addr = go32_get_dr; |
| 989 i386_set_debug_register_length (4); | 1013 i386_set_debug_register_length (4); |
| 990 | 1014 |
| 991 go32_ops.to_magic = OPS_MAGIC; | 1015 go32_ops.to_magic = OPS_MAGIC; |
| 992 | 1016 |
| 993 /* Initialize child's cwd as empty to be initialized when starting | 1017 /* Initialize child's cwd as empty to be initialized when starting |
| 994 the child. */ | 1018 the child. */ |
| 995 *child_cwd = 0; | 1019 *child_cwd = 0; |
| 996 | 1020 |
| 997 /* Initialize child's command line storage. */ | 1021 /* Initialize child's command line storage. */ |
| 998 if (redir_debug_init (&child_cmd) == -1) | 1022 if (redir_debug_init (&child_cmd) == -1) |
| (...skipping 1130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2129 } | 2153 } |
| 2130 | 2154 |
| 2131 int | 2155 int |
| 2132 tcsetpgrp (int fd, pid_t pgid) | 2156 tcsetpgrp (int fd, pid_t pgid) |
| 2133 { | 2157 { |
| 2134 if (isatty (fd) && pgid == SOME_PID) | 2158 if (isatty (fd) && pgid == SOME_PID) |
| 2135 return 0; | 2159 return 0; |
| 2136 errno = pgid == SOME_PID ? ENOTTY : ENOSYS; | 2160 errno = pgid == SOME_PID ? ENOTTY : ENOSYS; |
| 2137 return -1; | 2161 return -1; |
| 2138 } | 2162 } |
| OLD | NEW |