From e715727613e4d7988a8b2988e37ef2bfc8304947 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 21 Jul 2011 15:10:07 +0000 Subject: [PATCH] 2011-07-21 Sebastian Huber * shared/clock/clock.c: Fix to clear the first pending decrementer exception. --- c/src/lib/libbsp/powerpc/ChangeLog | 5 ++++ c/src/lib/libbsp/powerpc/shared/clock/clock.c | 27 ++++++++++++++----- 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 + + * shared/clock/clock.c: Fix to clear the first pending decrementer + exception. + 2011-07-20 Till Straumann 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 + * * * 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 */