summaryrefslogtreecommitdiff
path: root/vg_startup.S
diff options
context:
space:
mode:
authorsewardj <sewardj@a5019735-40e9-0310-863c-91ae7b9d1cf9>2002-04-21 13:05:34 +0000
committersewardj <sewardj@a5019735-40e9-0310-863c-91ae7b9d1cf9>2002-04-21 13:05:34 +0000
commit35805421ec71fda7823ab4efb364d22f873c60e1 (patch)
tree33d9a6a6fcb82f63e2081811c07e251c5308d057 /vg_startup.S
parentf854f47f35988a85a70cfdd3a5a6f95e05798dac (diff)
Make the GDB-attach stuff thread-aware, and work (at least partially)
when running multithreaded. Can still cause crashes (assertion failures) when GDB exits. I think it that's due to my use of libc's system() call; should roll my own. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@111 a5019735-40e9-0310-863c-91ae7b9d1cf9
Diffstat (limited to 'vg_startup.S')
-rw-r--r--vg_startup.S29
1 files changed, 17 insertions, 12 deletions
diff --git a/vg_startup.S b/vg_startup.S
index 1215e687..1a3b60fc 100644
--- a/vg_startup.S
+++ b/vg_startup.S
@@ -175,6 +175,12 @@ VG_(switch_to_real_CPU):
/*--- %esp/%ebp and then start up GDB. ---*/
/*------------------------------------------------------------*/
+/*
+extern void VG_(swizzle_esp_then_start_GDB) ( Addr m_eip_at_error,
+ Addr m_esp_at_error,
+ Addr m_ebp_at_error );
+*/
+
/*--- This is clearly not re-entrant! ---*/
.data
vg_ebp_saved_over_GDB_start:
@@ -190,12 +196,15 @@ VG_(swizzle_esp_then_start_GDB):
# remember the simulators current stack/frame pointers
movl %ebp, vg_ebp_saved_over_GDB_start
movl %esp, vg_esp_saved_over_GDB_start
-
- movl $VG_(baseBlock), %ebx
- # fetch %ESP into %esp
- movl VGOFF_(m_esp), %esi
- movl (%ebx, %esi, 4), %esp
+ # get args into regs
+ movl 44(%esp), %eax # client %EBP
+ movl 40(%esp), %ebx # client %ESP
+ movl 36(%esp), %ecx # client %EIP
+
+ # Now thatn we don't need to refer to simulators stack any more,
+ # put %ESP into %esp
+ movl %ebx, %esp
### %esp now refers to clients stack
### mess with the clients stack to make it look as if it
@@ -203,14 +212,10 @@ VG_(swizzle_esp_then_start_GDB):
### as if the top (currently executing) stack frame of the
### client is missing.
- # push %EIP, via %eax. This is a faked-up return address.
- movl VGOFF_(m_eip), %esi
- movl (%ebx, %esi, 4), %eax
- pushl %eax
+ # push %EIP. This is a faked-up return address.
+ pushl %ecx
- # push %EBP, via %eax. This is a faked %ebp-chain pointer.
- movl VGOFF_(m_ebp), %esi
- movl (%ebx, %esi, 4), %eax
+ # push %EBP. This is a faked %ebp-chain pointer.
pushl %eax
movl %esp, %ebp