* configure.srv [s390x-*-linux*]: Set srv_regobj to include both
authorUlrich Weigand <uweigand@de.ibm.com>
Wed, 27 Feb 2008 03:31:05 +0000 (03:31 +0000)
committerUlrich Weigand <uweigand@de.ibm.com>
Wed, 27 Feb 2008 03:31:05 +0000 (03:31 +0000)
reg-s390.o and reg-s390x.o.

* linux-low.c (new_inferior): New global variable.
(linux_create_inferior, linux_attach): Set it.
(linux_wait_for_process): Call the_low_target.arch_setup after the
target has stopped for the first time.
(initialize_low): Do not call the_low_target.arch_setup.

* linux-s390-low.c (s390_get_pc): Support bi-arch operation.
(s390_set_pc): Likewise.
(s390_arch_setup): New function.
(the_low_target): Use s390_arch_setup as arch_setup routine.

* regcache.c (realloc_register_cache): New function.
(set_register_cache): Call it for each existing regcache.

gdb/gdbserver/ChangeLog
gdb/gdbserver/configure.srv
gdb/gdbserver/linux-low.c
gdb/gdbserver/linux-s390-low.c
gdb/gdbserver/regcache.c

index 80ea9f9539a15f272180cc8fe6645aa366786810..ae63d4e6cd5edf2507c7898b351989554bce170c 100644 (file)
@@ -1,3 +1,22 @@
+2008-02-27  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * configure.srv [s390x-*-linux*]: Set srv_regobj to include both
+       reg-s390.o and reg-s390x.o.
+
+       * linux-low.c (new_inferior): New global variable.
+       (linux_create_inferior, linux_attach): Set it.
+       (linux_wait_for_process): Call the_low_target.arch_setup after the
+       target has stopped for the first time.
+       (initialize_low): Do not call the_low_target.arch_setup.
+
+       * linux-s390-low.c (s390_get_pc): Support bi-arch operation.
+       (s390_set_pc): Likewise.
+       (s390_arch_setup): New function.
+       (the_low_target): Use s390_arch_setup as arch_setup routine.
+
+       * regcache.c (realloc_register_cache): New function.
+       (set_register_cache): Call it for each existing regcache.
+
 2008-02-27  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * server.h (init_registers): Remove prototype.
index 4f1c22b3aa4a9b4be5a828c51d1cdd72e497b40b..b529c027b133ce460254d6aca1eb0708ccaf24f7 100644 (file)
@@ -145,7 +145,7 @@ case "${target}" in
                        srv_linux_regsets=yes
                        srv_linux_thread_db=yes
                        ;;
-  s390x-*-linux*)      srv_regobj=reg-s390x.o
+  s390x-*-linux*)      srv_regobj="reg-s390.o reg-s390x.o"
                        srv_tgtobj="linux-low.o linux-s390-low.o"
                        srv_linux_usrregs=yes
                        srv_linux_regsets=yes
index d5a8fb41fe8536cabf4335dadb6d0ddf56615b83..732aafbc80f88e263bfbc177289c4044b36e8953 100644 (file)
@@ -107,6 +107,11 @@ static int thread_db_active;
 
 static int must_set_ptrace_flags;
 
+/* This flag is true iff we've just created or attached to a new inferior
+   but it has not stopped yet.  As soon as it does, we need to call the
+   low target's arch_setup callback.  */
+static int new_inferior;
+
 static void linux_resume_one_process (struct inferior_list_entry *entry,
                                      int step, int signal, siginfo_t *info);
 static void linux_resume (struct thread_resume *resume_info);
@@ -291,6 +296,7 @@ linux_create_inferior (char *program, char **allargs)
   new_process = add_process (pid);
   add_thread (pid, new_process, pid);
   must_set_ptrace_flags = 1;
+  new_inferior = 1;
 
   return pid;
 }
@@ -350,6 +356,8 @@ linux_attach (unsigned long pid)
   process = (struct process_info *) find_inferior_id (&all_processes, pid);
   process->stop_expected = 0;
 
+  new_inferior = 1;
+
   return 0;
 }
 
@@ -616,6 +624,16 @@ retry:
 
   (*childp)->last_status = *wstatp;
 
+  /* Architecture-specific setup after inferior is running.
+     This needs to happen after we have attached to the inferior
+     and it is stopped for the first time, but before we access
+     any inferior registers.  */
+  if (new_inferior)
+    {
+      the_low_target.arch_setup ();
+      new_inferior = 0;
+    }
+
   if (debug_threads
       && WIFSTOPPED (*wstatp))
     {
@@ -2072,7 +2090,6 @@ initialize_low (void)
   set_target_ops (&linux_target_ops);
   set_breakpoint_data (the_low_target.breakpoint,
                       the_low_target.breakpoint_len);
-  the_low_target.arch_setup ();
   linux_init_signals ();
   linux_test_for_tracefork ();
 }
index 6ae1a236d0c59fcd913b272d0ad47dee81993848..d6739ab1be88e86bc01a2ed8b257e2e5a6bf0f08 100644 (file)
@@ -102,24 +102,61 @@ static const unsigned char s390_breakpoint[] = { 0, 1 };
 static CORE_ADDR
 s390_get_pc ()
 {
-  unsigned long pc;
-  collect_register_by_name ("pswa", &pc);
+  if (register_size (0) == 4)
+    {
+      unsigned int pc;
+      collect_register_by_name ("pswa", &pc);
 #ifndef __s390x__
-  pc &= 0x7fffffff;
+      pc &= 0x7fffffff;
 #endif
-  return pc;
+      return pc;
+    }
+  else
+    {
+      unsigned long pc;
+      collect_register_by_name ("pswa", &pc);
+      return pc;
+    }
 }
 
 static void
 s390_set_pc (CORE_ADDR newpc)
 {
-  unsigned long pc = newpc;
+  if (register_size (0) == 4)
+    {
+      unsigned int pc = newpc;
 #ifndef __s390x__
-  pc |= 0x80000000;
+      pc |= 0x80000000;
 #endif
-  supply_register_by_name ("pswa", &pc);
+      supply_register_by_name ("pswa", &pc);
+    }
+  else
+    {
+      unsigned long pc = newpc;
+      supply_register_by_name ("pswa", &pc);
+    }
 }
 
+
+static void
+s390_arch_setup (void)
+{
+  /* Assume 31-bit inferior process.  */
+  init_registers_s390 ();
+
+  /* On a 64-bit host, check the low bit of the (31-bit) PSWM
+     -- if this is one, we actually have a 64-bit inferior.  */
+#ifdef __s390x__
+  {
+    unsigned int pswm;
+    collect_register_by_name ("pswm", &pswm);
+    if (pswm & 1)
+      init_registers_s390x ();
+  }
+#endif
+}
+
+
 static int
 s390_breakpoint_at (CORE_ADDR pc)
 {
@@ -130,11 +167,7 @@ s390_breakpoint_at (CORE_ADDR pc)
 
 
 struct linux_target_ops the_low_target = {
-#ifndef __s390x__
-  init_registers_s390,
-#else
-  init_registers_s390x,
-#endif
+  s390_arch_setup,
   s390_num_regs,
   s390_regmap,
   s390_cannot_fetch_register,
index 7b2285a4c3b0abe81216f6c0039c9b2eeedc7576..a42d95ba9f0100e9c15134d6127cd1fbab38a69d 100644 (file)
@@ -121,6 +121,15 @@ free_register_cache (void *regcache_p)
   free (regcache);
 }
 
+static void
+realloc_register_cache (struct inferior_list_entry *thread_p)
+{
+  struct thread_info *thread = (struct thread_info *) thread_p;
+
+  free_register_cache (inferior_regcache_data (thread));
+  set_inferior_regcache_data (thread, new_register_cache ());
+}
+
 void
 set_register_cache (struct reg *regs, int n)
 {
@@ -137,6 +146,9 @@ set_register_cache (struct reg *regs, int n)
     }
 
   register_bytes = offset / 8;
+
+  /* Re-allocate all pre-existing register caches.  */
+  for_each_inferior (&all_threads, realloc_register_cache);
 }
 
 void
This page took 0.034484 seconds and 4 git commands to generate.