[PATCH v3] rtems: Fix _Rate_monotonic_Renew_deadline()
Gedare Bloom
gedare at rtems.org
Fri Jan 27 21:27:15 UTC 2017
The acinclude came back
On Fri, Jan 27, 2017 at 3:03 PM, Kuan-Hsun Chen <c0066c at gmail.com> wrote:
> Prepare a precondition to prevent the potential integer overflow.
>
> Remove one redundant parameter in _Rate_monotonic_Renew_deadline().
>
> sptests/sp78: Create
> A test case for checking the overflow condition of postponed_jobs
> in rtems_rate_monotonic_period_status.
>
> Close #2885.
> ---
> c/src/lib/libbsp/powerpc/acinclude.m4 | 4 +-
> cpukit/rtems/src/ratemontimeout.c | 11 ++--
> testsuites/sptests/Makefile.am | 2 +-
> testsuites/sptests/configure.ac | 1 +
> testsuites/sptests/sp78/Makefile.am | 22 +++++++
> testsuites/sptests/sp78/init.c | 120 ++++++++++++++++++++++++++++++++++
> testsuites/sptests/sp78/sp78.doc | 18 +++++
> testsuites/sptests/sp78/sp78.scn | 9 +++
> 8 files changed, 180 insertions(+), 7 deletions(-)
> create mode 100644 testsuites/sptests/sp78/Makefile.am
> create mode 100644 testsuites/sptests/sp78/init.c
> create mode 100644 testsuites/sptests/sp78/sp78.doc
> create mode 100644 testsuites/sptests/sp78/sp78.scn
>
> diff --git a/c/src/lib/libbsp/powerpc/acinclude.m4 b/c/src/lib/libbsp/powerpc/acinclude.m4
> index 4c83475..edc67b5 100644
> --- a/c/src/lib/libbsp/powerpc/acinclude.m4
> +++ b/c/src/lib/libbsp/powerpc/acinclude.m4
> @@ -32,12 +32,12 @@ AC_DEFUN([RTEMS_CHECK_BSPDIR],
> AC_CONFIG_SUBDIRS([t32mppc]);;
> tqm8xx )
> AC_CONFIG_SUBDIRS([tqm8xx]);;
> - virtex )
> - AC_CONFIG_SUBDIRS([virtex]);;
> virtex4 )
> AC_CONFIG_SUBDIRS([virtex4]);;
> virtex5 )
> AC_CONFIG_SUBDIRS([virtex5]);;
> + virtex )
> + AC_CONFIG_SUBDIRS([virtex]);;
> *)
> AC_MSG_ERROR([Invalid BSP]);;
> esac
> diff --git a/cpukit/rtems/src/ratemontimeout.c b/cpukit/rtems/src/ratemontimeout.c
> index bcc4ccf..5a838fd 100644
> --- a/cpukit/rtems/src/ratemontimeout.c
> +++ b/cpukit/rtems/src/ratemontimeout.c
> @@ -9,7 +9,7 @@
> * COPYRIGHT (c) 1989-2009.
> * On-Line Applications Research Corporation (OAR).
> *
> - * COPYRIGHT (c) 2016 Kuan-Hsun Chen.
> + * COPYRIGHT (c) 2016-2017 Kuan-Hsun Chen.
> *
> * The license and distribution terms for this file may be
> * found in the file LICENSE in this distribution or at
> @@ -24,13 +24,16 @@
>
> static void _Rate_monotonic_Renew_deadline(
> Rate_monotonic_Control *the_period,
> - Thread_Control *owner,
> ISR_lock_Context *lock_context
> )
> {
> uint64_t deadline;
>
> - ++the_period->postponed_jobs;
> + /* stay at 0xffffffff if postponed_jobs is going to overflow */
> + if ( the_period->postponed_jobs != UINT32_MAX ) {
> + ++the_period->postponed_jobs;
> + }
> +
> the_period->state = RATE_MONOTONIC_EXPIRED;
>
> deadline = _Watchdog_Per_CPU_insert_relative(
> @@ -85,6 +88,6 @@ void _Rate_monotonic_Timeout( Watchdog_Control *the_watchdog )
> _Thread_Unblock( owner );
> }
> } else {
> - _Rate_monotonic_Renew_deadline( the_period, owner, &lock_context );
> + _Rate_monotonic_Renew_deadline( the_period, &lock_context );
> }
> }
> diff --git a/testsuites/sptests/Makefile.am b/testsuites/sptests/Makefile.am
> index 5ef87a0..11e9bcd 100644
> --- a/testsuites/sptests/Makefile.am
> +++ b/testsuites/sptests/Makefile.am
> @@ -10,7 +10,7 @@ _SUBDIRS = \
> sp40 sp41 sp42 sp43 sp44 sp45 sp46 sp47 sp48 sp49 \
> sp50 sp51 sp52 sp53 sp54 sp55 sp56 sp57 sp58 sp59 \
> sp60 sp62 sp63 sp64 sp65 sp66 sp67 sp68 sp69 \
> - sp70 sp71 sp72 sp73 sp74 sp75 sp76 sp77 sp2038 \
> + sp70 sp71 sp72 sp73 sp74 sp75 sp76 sp77 sp78 sp2038 \
> spassoc01 spchain spcoverage spobjgetnext \
> spprintk spprivenv01 sprbtree01 spsize spstkalloc \
> spstkalloc02 spthreadq01 spwatchdog spwkspace \
> diff --git a/testsuites/sptests/configure.ac b/testsuites/sptests/configure.ac
> index 77ec512..a2af200 100644
> --- a/testsuites/sptests/configure.ac
> +++ b/testsuites/sptests/configure.ac
> @@ -144,6 +144,7 @@ sp74/Makefile
> sp75/Makefile
> sp76/Makefile
> sp77/Makefile
> +sp78/Makefile
> sp2038/Makefile
> spassoc01/Makefile
> spcbssched01/Makefile
> diff --git a/testsuites/sptests/sp78/Makefile.am b/testsuites/sptests/sp78/Makefile.am
> new file mode 100644
> index 0000000..e814104
> --- /dev/null
> +++ b/testsuites/sptests/sp78/Makefile.am
> @@ -0,0 +1,22 @@
> +
> +rtems_tests_PROGRAMS = sp78
> +sp78_SOURCES = init.c ../../support/src/spin.c
> +
> +dist_rtems_tests_DATA = sp78.scn
> +dist_rtems_tests_DATA += sp78.doc
> +
> +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP at .cfg
> +include $(top_srcdir)/../automake/compile.am
> +include $(top_srcdir)/../automake/leaf.am
> +
> +
> +AM_CPPFLAGS += -I$(top_srcdir)/../support/include
> +
> +LINK_OBJS = $(sp78_OBJECTS)
> +LINK_LIBS = $(sp78_LDLIBS)
> +
> +sp78$(EXEEXT): $(sp78_OBJECTS) $(sp78_DEPENDENCIES)
> + @rm -f sp78$(EXEEXT)
> + $(make-exe)
> +
> +include $(top_srcdir)/../automake/local.am
> diff --git a/testsuites/sptests/sp78/init.c b/testsuites/sptests/sp78/init.c
> new file mode 100644
> index 0000000..4d3f534
> --- /dev/null
> +++ b/testsuites/sptests/sp78/init.c
> @@ -0,0 +1,120 @@
> +/*
> + * COPYRIGHT (c) 2017 Kuan-Hsun Chen.
> + *
> + * The license and distribution terms for this file may be
> + * found in the file LICENSE in this distribution or at
> + * http://www.rtems.org/license/LICENSE.
> + */
> +
> +#ifdef HAVE_CONFIG_H
> +#include "config.h"
> +#endif
> +
> +#include <rtems/cpuuse.h>
> +#include <tmacros.h>
> +#include <rtems/rtems/ratemonimpl.h>
> +#include "test_support.h"
> +
> +const char rtems_test_name[] = "SP 78";
> +
> +/* forward declarations to avoid warnings */
> +rtems_task Init( rtems_task_argument argument );
> +static void modify_count( rtems_id id );
> +
> +static void modify_count(
> + rtems_id id
> +)
> +{
> + Rate_monotonic_Control *the_period;
> + ISR_lock_Context lock_context;
> +
> + the_period = _Rate_monotonic_Get( id, &lock_context );
> + _Rate_monotonic_Acquire_critical( the_period, &lock_context );
> + the_period->postponed_jobs = UINT32_MAX;
> + _Rate_monotonic_Release( the_period, &lock_context );
> +}
> +
> +rtems_task Init(
> + rtems_task_argument argument
> +)
> +{
> + rtems_id period_id;
> + rtems_name period_name;
> + rtems_rate_monotonic_period_status period_status;
> + rtems_status_code status;
> + int i;
> +
> + period_name = rtems_build_name('P','E','R','1');
> +
> + TEST_BEGIN();
> +
> + /* create period */
> + status = rtems_rate_monotonic_create(
> + period_name,
> + &period_id
> + );
> + directive_failed( status, "rate_monotonic_create" );
> +
> + /* modify the count to UINT32_MAX and attempt to miss deadline*/
> + puts( "Testing overflow condition" );
> + rtems_test_spin_until_next_tick();
> + status = rtems_rate_monotonic_period( period_id, 50 );
> + directive_failed( status, "rate_monotonic_period above loop" );
> +
> + puts( "Modify the count of postponed_job manually" );
> + modify_count( period_id );
> +
> + /* Check the status */
> + status = rtems_rate_monotonic_get_status( period_id, &period_status );
> + directive_failed( status, "rate_monotonic_get_status" );
> + printf( "Init Postponed jobs = %"PRIu32", and expected %"PRIu32"\n", period_status.postponed_jobs_count, UINT32_MAX );
> + rtems_test_assert( period_status.postponed_jobs_count == UINT32_MAX );
> +
> + for ( i=1 ; i <= 2 ; i++ ) {
> + status = rtems_task_wake_after( 100 );
> + directive_failed( status, "rtems_task_wake_after(100)" );
> + puts( "Task misses its deadline." );
> +
> + /* Check the status */
> + status = rtems_rate_monotonic_get_status( period_id, &period_status );
> + directive_failed( status, "rate_monotonic_get_status" );
> +
> + /* print out the count which should keep in UINT32_MAX, since the period still misses its deadline */
> + printf( "Count = %"PRIu32", and expected %"PRIu32"\n", period_status.postponed_jobs_count, UINT32_MAX);
> + rtems_test_assert( period_status.postponed_jobs_count == UINT32_MAX);
> +
> + rtems_test_spin_until_next_tick();
> + status = rtems_rate_monotonic_period( period_id, 50 );
> + fatal_directive_status(
> + status,
> + RTEMS_TIMEOUT,
> + "rtems_rate_monotonic_period 2-n"
> + );
> +
> +
> + }
> +
> + TEST_END();
> +
> + rtems_test_exit(0);
> +}
> +
> +/* configuration information */
> +
> +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
> +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
> +
> +#define CONFIGURE_MILLISECONDS_PER_TICK 1
> +
> +#define CONFIGURE_MAXIMUM_TASKS 1
> +#define CONFIGURE_MAXIMUM_PERIODS 1
> +
> +#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
> +
> +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
> +
> +
> +#define CONFIGURE_INIT
> +
> +#include <rtems/confdefs.h>
> +/* end of file */
> diff --git a/testsuites/sptests/sp78/sp78.doc b/testsuites/sptests/sp78/sp78.doc
> new file mode 100644
> index 0000000..ad64e4b
> --- /dev/null
> +++ b/testsuites/sptests/sp78/sp78.doc
> @@ -0,0 +1,18 @@
> +# COPYRIGHT (c) 2017 Kuan-Hsun Chen.
> +#
> +# The license and distribution terms for this file may be
> +# found in the file LICENSE in this distribution or at
> +# http://www.rtems.org/license/LICENSE.
> +#
> +
> +This file describes the directives and concepts tested by this test set.
> +
> +test set name: sp78
> +
> +directives:
> +
> + rtems_rate_monotonic_get_status
> +
> +concepts:
> +
> ++ Test the overflow condition for postponed_jobs.
> diff --git a/testsuites/sptests/sp78/sp78.scn b/testsuites/sptests/sp78/sp78.scn
> new file mode 100644
> index 0000000..4cb71db
> --- /dev/null
> +++ b/testsuites/sptests/sp78/sp78.scn
> @@ -0,0 +1,9 @@
> +*** BEGIN OF TEST SP 78 ***
> +Testing overflow condition
> +Modify the count of postponed_job manually
> +Init Postponed jobs = 4294967295, and expected 4294967295
> +Task misses its deadline.
> +Count = 4294967295, and expected 4294967295
> +Task misses its deadline.
> +Count = 4294967295, and expected 4294967295
> +*** END OF TEST SP 78 ***
> --
> 1.9.1
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
More information about the devel
mailing list