]> Zhao Yanbai Git Server - minix.git/commitdiff
kernel:enable trace on arm. 36/336/2
authorKees Jongenburger <keesj@minix3.org>
Sat, 16 Feb 2013 21:32:19 +0000 (22:32 +0100)
committerKees Jongenburger <keesj@minix3.org>
Sun, 17 Feb 2013 07:40:38 +0000 (08:40 +0100)
Change-Id: Iabe6dfd758e8f1cdb4a18e2f2ab8f8ca988f3c86

kernel/arch/earm/include/archconst.h
kernel/system/do_trace.c

index 48307638b578c57f5597c1ff0db6e23983b97351..96999e898ae7f887e47168bd5b53176022684ac6 100644 (file)
  */
 #define ARM_STACK_TOP_RESERVED (2 * sizeof(reg_t))
 
+/* only selected bits are changeable by user e.g.[31:9] and skip the 
+ * mode bits. It is probably is a better idea to look at the current 
+ * status to determine if one is allowed to write these values. This 
+ * might allow debugging of privileged processes 
+ */
+#define SET_USR_PSR(rp, npsr) \
+       rp->p_reg.psr = ( rp->p_reg.psr & 0x1F) | ( npsr & ~0x1F)
+
+
 #define PG_ALLOCATEME ((phys_bytes)-1)
 
 #endif /* _ARM_ACONST_H */
index 24bfcc5883bf433d2e3cd1274ceb4a84326dac07..1bcb8fe21d0e96f2b644b745695b13e47a64d243 100644 (file)
@@ -154,6 +154,13 @@ int do_trace(struct proc * caller, message * m_ptr)
                SETPSW(rp, tr_data);
        else
                *(reg_t *) ((char *) &rp->p_reg + i) = (reg_t) tr_data;
+#else 
+       if (i == (int) &((struct proc *) 0)->p_reg.psr) {
+               /* only selected bits are changeable */
+               SET_USR_PSR(rp, tr_data);
+       } else {
+               *(reg_t *) ((char *) &rp->p_reg + i) = (reg_t) tr_data;
+       }
 #endif
        m_ptr->CTL_DATA = 0;
        break;