summaryrefslogtreecommitdiffstats
path: root/c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2011-07-21 15:10:07 +0000
committerSebastian Huber <sebastian.huber@embedded-brains.de>2011-07-21 15:10:07 +0000
commite715727613e4d7988a8b2988e37ef2bfc8304947 (patch)
tree93c64cbbf10630584f36255047eb442e72e225ff /c
parent2011-07-21 Sebastian Huber <sebastian.huber@embedded-brains.de> (diff)
downloadrtems-e715727613e4d7988a8b2988e37ef2bfc8304947.tar.bz2
2011-07-21 Sebastian Huber <sebastian.huber@embedded-brains.de>
* shared/clock/clock.c: Fix to clear the first pending decrementer exception.
Diffstat (limited to 'c')
-rw-r--r--c/src/lib/libbsp/powerpc/ChangeLog5
-rw-r--r--c/src/lib/libbsp/powerpc/shared/clock/clock.c27
2 files changed, 25 insertions, 7 deletions
diff --git a/c/src/lib/libbsp/powerpc/ChangeLog b/c/src/lib/libbsp/powerpc/ChangeLog
index f6b8a9bcd3..511dd8e4b0 100644
--- a/c/src/lib/libbsp/powerpc/ChangeLog
+++ b/c/src/lib/libbsp/powerpc/ChangeLog
@@ -1,3 +1,8 @@
+2011-07-21 Sebastian Huber <sebastian.huber@embedded-brains.de>
+
+ * shared/clock/clock.c: Fix to clear the first pending decrementer
+ exception.
+
2011-07-20 Till Straumann <strauman@slac.stanford.edu>
PR 1837/bsps
diff --git a/c/src/lib/libbsp/powerpc/shared/clock/clock.c b/c/src/lib/libbsp/powerpc/shared/clock/clock.c
index 54efc46298..27523c592c 100644
--- a/c/src/lib/libbsp/powerpc/shared/clock/clock.c
+++ b/c/src/lib/libbsp/powerpc/shared/clock/clock.c
@@ -7,12 +7,13 @@
*/
/*
- * Copyright (c) 2008, 2009
- * Embedded Brains GmbH
- * Obere Lagerstr. 30
- * D-82178 Puchheim
- * Germany
- * rtems@embedded-brains.de
+ * Copyright (c) 2008-2011 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Obere Lagerstr. 30
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
@@ -94,6 +95,18 @@ static int ppc_clock_exception_handler( BSP_Exception_frame *frame, unsigned num
return 0;
}
+static int ppc_clock_exception_handler_first( BSP_Exception_frame *frame, unsigned number)
+{
+ /* We have to clear the first pending decrementer exception this way */
+
+ if (ppc_decrementer_register() >= 0x80000000) {
+ ppc_clock_exception_handler( frame, number);
+ }
+
+ ppc_exc_set_handler( ASM_DEC_VECTOR, ppc_clock_exception_handler);
+
+ return 0;
+}
static int ppc_clock_exception_handler_booke( BSP_Exception_frame *frame, unsigned number)
{
@@ -208,7 +221,7 @@ rtems_device_driver Clock_initialize( rtems_device_major_number major, rtems_dev
ppc_clock_next_time_base = ppc_time_base() + ppc_clock_decrementer_value;
/* Install exception handler */
- ppc_exc_set_handler( ASM_DEC_VECTOR, ppc_clock_exception_handler);
+ ppc_exc_set_handler( ASM_DEC_VECTOR, ppc_clock_exception_handler_first);
}
/* Set the decrementer value */