From c224ec66c5f914d142ee946f18e1b2805cc3d9b7 Mon Sep 17 00:00:00 2001
From: "hp.com!davidm" <hp.com!davidm>
Date: Tue, 3 May 2005 09:13:17 +0000
Subject: [PATCH] (UNW_HPPA_EH3): Fix comment-typo.

2004/12/02 18:37:47-08:00 hp.com!davidm
(unw_tdep_fpreg_t): Make it a union of "double" and two 32-bit words.
(unw_tdep_getcontext): Fix typo.

2004/12/02 00:40:45-08:00 mostang.com!davidm
(_U_TDEP_QP_TRUE): New macro.
(UNW_TDEP_CURSOR_LEN): Increase from 127 to 511 to accommodate
	DWARF cursor-size.
(unw_word_t): Change from uint64_t to uint32_t since user-land
	PA-Linux is only 32 bits.
(hppa_regnum_t): Add register names UNW_HPPA_EH0, UNW_HPPA_EH1,
	UNW_HPPA_EH2, UNW_HPPA_EH3, UNW_HPPA_CFA, and
	UNW_HPPA_EH.
(UNW_TDEP_NUM_EH_REGS): New macro.
(unw_tdep_getcontext): Point it at UNW_ARCH_OBJ(getcontext).

(Logical change 1.290)
---
 include/libunwind-hppa.h | 57 ++++++++++++++++++++++++++++------------
 1 file changed, 40 insertions(+), 17 deletions(-)

diff --git a/include/libunwind-hppa.h b/include/libunwind-hppa.h
index 75fb14c1..0c78e1bb 100644
--- a/include/libunwind-hppa.h
+++ b/include/libunwind-hppa.h
@@ -1,6 +1,5 @@
 /* libunwind - a platform-independent unwind library
-   Copyright (C) 2003 Hewlett-Packard Co
-	Contributed by Scott Marovitch
+   Copyright (C) 2003-2004 Hewlett-Packard Co
 
 This file is part of libunwind.
 
@@ -36,28 +35,33 @@ extern "C" {
 #define UNW_TARGET	hppa
 #define UNW_TARGET_HPPA	1
 
+#define _U_TDEP_QP_TRUE	0	/* see libunwind-dynamic.h  */
+
 /* This needs to be big enough to accommodate "struct cursor", while
    leaving some slack for future expansion.  Changing this value will
    require recompiling all users of this library.  Stack allocation is
    relatively cheap and unwind-state copying is relatively rare, so we
    want to err on making it rather too big than too small.  */
-#define UNW_TDEP_CURSOR_LEN	127
+#define UNW_TDEP_CURSOR_LEN	511
 
-typedef uint64_t unw_word_t;
+typedef uint32_t unw_word_t;
 
-typedef struct
+typedef union
   {
-    /* no PA-RISC-specific auxiliary proc-info */
+    struct { unw_word_t bits[2]; } raw;
+    double val;
   }
-unw_tdep_proc_info_t;
+unw_tdep_fpreg_t;
 
 typedef enum
   {
-    /* Note: general registers are excepted to start with index 0.
+    /* Note: general registers are expected to start with index 0.
        This convention facilitates architecture-independent
        implementation of the C++ exception handling ABI.  See
        _Unwind_SetGR() and _Unwind_GetGR() for details.  */
     UNW_HPPA_GR = 0,
+     UNW_HPPA_RP = 2,			/* return pointer */
+     UNW_HPPA_FP = 3,			/* frame pointer */
      UNW_HPPA_SP = UNW_HPPA_GR + 30,
 
     UNW_HPPA_FR = UNW_HPPA_GR + 32,
@@ -66,13 +70,29 @@ typedef enum
 
     /* other "preserved" registers (fpsr etc.)... */
 
+    /* PA-RISC has 4 exception-argument registers but they're not
+       contiguous.  To deal with this, we define 4 pseudo
+       exception-handling registers which we then alias to the actual
+       physical register.  */
+
+    UNW_HPPA_EH0 = UNW_HPPA_IP + 1,	/* alias for UNW_HPPA_GR + 20 */
+    UNW_HPPA_EH1 = UNW_HPPA_EH0 + 1,	/* alias for UNW_HPPA_GR + 21 */
+    UNW_HPPA_EH2 = UNW_HPPA_EH1 + 1,	/* alias for UNW_HPPA_GR + 22 */
+    UNW_HPPA_EH3 = UNW_HPPA_EH2 + 1,	/* alias for UNW_HPPA_GR + 31 */
+
+    /* frame info (read-only) */
+    UNW_HPPA_CFA,
+
     UNW_TDEP_LAST_REG = UNW_HPPA_IP,
 
     UNW_TDEP_IP = UNW_HPPA_IP,
-    UNW_TDEP_SP = UNW_HPPA_SP
+    UNW_TDEP_SP = UNW_HPPA_SP,
+    UNW_TDEP_EH = UNW_HPPA_EH0
   }
 hppa_regnum_t;
 
+#define UNW_TDEP_NUM_EH_REGS	4
+
 typedef struct unw_tdep_save_loc
   {
     /* Additional target-dependent info on a save location.  */
@@ -82,18 +102,21 @@ unw_tdep_save_loc_t;
 /* On PA-RISC, we can directly use ucontext_t as the unwind context.  */
 typedef ucontext_t unw_tdep_context_t;
 
-/* XXX this is not ideal: an application should not be prevented from
-   using the "getcontext" name just because it's using libunwind.  We
-   can't just use __getcontext() either, because that isn't exported
-   by glibc...  */
-#define unw_tdep_getcontext(uc)		(getcontext (uc), 0)
-
-/* XXX fixme: */
-#define unw_tdep_is_fpreg(r)		((unsigned) ((r) - UNW_HPPA_FR) < 128)
+#define unw_tdep_is_fpreg(r)		((unsigned) ((r) - UNW_HPPA_FR) < 32)
 
 #include "libunwind-dynamic.h"
+
+typedef struct
+  {
+    /* no PA-RISC-specific auxiliary proc-info */
+  }
+unw_tdep_proc_info_t;
+
 #include "libunwind-common.h"
 
+#define unw_tdep_getcontext		UNW_ARCH_OBJ (getcontext)
+extern int unw_tdep_getcontext (unw_tdep_context_t *);
+
 #if defined(__cplusplus) || defined(c_plusplus)
 }
 #endif