diff options
Diffstat (limited to 'cpukit/libmisc')
122 files changed, 4264 insertions, 4428 deletions
diff --git a/cpukit/libmisc/bspcmdline/bspcmdline_get.c b/cpukit/libmisc/bspcmdline/bspcmdline_get.c index 029cb6b8e6..f867e8b0d1 100644 --- a/cpukit/libmisc/bspcmdline/bspcmdline_get.c +++ b/cpukit/libmisc/bspcmdline/bspcmdline_get.c @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /** * @file * @@ -10,9 +12,26 @@ * COPYRIGHT (c) 1989-2009. * On-Line Applications Research Corporation (OAR). * - * 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. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/bspcmdline/bspcmdline_getparam.c b/cpukit/libmisc/bspcmdline/bspcmdline_getparam.c index f18773a49a..1920b3a98e 100644 --- a/cpukit/libmisc/bspcmdline/bspcmdline_getparam.c +++ b/cpukit/libmisc/bspcmdline/bspcmdline_getparam.c @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /** * @file * @@ -10,9 +12,26 @@ * COPYRIGHT (c) 1989-2009. * On-Line Applications Research Corporation (OAR). * - * 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. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/bspcmdline/bspcmdline_getparamraw.c b/cpukit/libmisc/bspcmdline/bspcmdline_getparamraw.c index db4a01aed3..833ddbccc2 100644 --- a/cpukit/libmisc/bspcmdline/bspcmdline_getparamraw.c +++ b/cpukit/libmisc/bspcmdline/bspcmdline_getparamraw.c @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /** * @file * @@ -10,9 +12,26 @@ * COPYRIGHT (c) 1989-2009. * On-Line Applications Research Corporation (OAR). * - * 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. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/bspcmdline/bspcmdline_getparamrhs.c b/cpukit/libmisc/bspcmdline/bspcmdline_getparamrhs.c index aab5b02850..71fe4b6e60 100644 --- a/cpukit/libmisc/bspcmdline/bspcmdline_getparamrhs.c +++ b/cpukit/libmisc/bspcmdline/bspcmdline_getparamrhs.c @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /** * @file * @@ -10,9 +12,26 @@ * COPYRIGHT (c) 1989-2009. * On-Line Applications Research Corporation (OAR). * - * 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. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/capture/README b/cpukit/libmisc/capture/README index 3e59637149..806bb37d1f 100644 --- a/cpukit/libmisc/capture/README +++ b/cpukit/libmisc/capture/README @@ -1,7 +1,7 @@ RTEMS Performance Monitoring and Measurement Framework - Copyright 2002-2007 Chris Johns (chrisj@rtems.org) - 23 April 2002 + Copyright 2002-2007 Chris Johns (chrisj@rtems.org) + 23 April 2002 This directory contains the source code for the performance monitoring and measurement framework. It is more commonly know as the capture engine. diff --git a/cpukit/libmisc/capture/capture-cli.c b/cpukit/libmisc/capture/capture-cli.c index d489d9f32a..e71bb0e0e0 100644 --- a/cpukit/libmisc/capture/capture-cli.c +++ b/cpukit/libmisc/capture/capture-cli.c @@ -1,25 +1,42 @@ -/* - ------------------------------------------------------------------------ - - Copyright 2002, 2015 Chris Johns <chrisj@rtems.org> - All rights reserved. - - COPYRIGHT (c) 2014. - On-Line Applications Research Corporation (OAR). - - The license and distribution terms for this file may be - found in the file LICENSE in this distribution. +/* SPDX-License-Identifier: BSD-2-Clause */ - This software with is provided ``as is'' and with NO WARRANTY. - - ------------------------------------------------------------------------ - - RTEMS Performance Monitoring and Measurement Framework. - - This is the Target Interface Command Line Interface. You need - start the RTEMS monitor. +/** + * @file + * + * @brief RTEMS Performance Monitoring and Measurement Framework. + * + * This is the Target Interface Command Line Interface. You need + * start the RTEMS monitor. + */ -*/ +/* + * Copyright 2002, 2015 Chris Johns <chrisj@rtems.org>. + * All rights reserved. + * + * COPYRIGHT (c) 2014. + * On-Line Applications Research Corporation (OAR). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/cpukit/libmisc/capture/capture.c b/cpukit/libmisc/capture/capture.c index bba7d91396..2228d135b8 100644 --- a/cpukit/libmisc/capture/capture.c +++ b/cpukit/libmisc/capture/capture.c @@ -1,24 +1,41 @@ -/* - ------------------------------------------------------------------------ - - Copyright 2002, 2016 Chris Johns <chrisj@rtems.org>. - All rights reserved. - - COPYRIGHT (c) 1989-2014. - On-Line Applications Research Corporation (OAR). - - The license and distribution terms for this file may be - found in the file LICENSE in this distribution. +/* SPDX-License-Identifier: BSD-2-Clause */ - This software with is provided ``as is'' and with NO WARRANTY. - - ------------------------------------------------------------------------ - - RTEMS Performance Monitoring and Measurement Framework. - - This is the Capture Engine component. +/** + * @file + * + * @brief RTEMS Performance Monitoring and Measurement Framework. + * + * This is the Capture Engine component. + */ -*/ +/* + * Copyright 2002, 2016 Chris Johns <chrisj@rtems.org>. + * All rights reserved. + * + * COPYRIGHT (c) 1989-2014. + * On-Line Applications Research Corporation (OAR). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/cpukit/libmisc/capture/capture_buffer.c b/cpukit/libmisc/capture/capture_buffer.c index 967842000b..aa79144cf6 100644 --- a/cpukit/libmisc/capture/capture_buffer.c +++ b/cpukit/libmisc/capture/capture_buffer.c @@ -1,22 +1,38 @@ -/* - ------------------------------------------------------------------------ - - COPYRIGHT (c) 2014. - On-Line Applications Research Corporation (OAR). - - The license and distribution terms for this file may be - found in the file LICENSE in this distribution. - - This software with is provided ``as is'' and with NO WARRANTY. +/* SPDX-License-Identifier: BSD-2-Clause */ - ------------------------------------------------------------------------ +/** + * @file + * + * @brief RTEMS Performance Monitoring and Measurement Framework. + * + * This is the Target Interface Command Line Interface. You need + * to start the RTEMS monitor. + */ - RTEMS Performance Monitoring and Measurement Framework. - - This is the Target Interface Command Line Interface. You need - start the RTEMS monitor. - -*/ +/* + * COPYRIGHT (c) 2014. On-Line Applications Research Corporation (OAR). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/cpukit/libmisc/capture/capture_buffer.h b/cpukit/libmisc/capture/capture_buffer.h index af75c0204c..cd26544ee1 100644 --- a/cpukit/libmisc/capture/capture_buffer.h +++ b/cpukit/libmisc/capture/capture_buffer.h @@ -1,27 +1,42 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /** * @file * * @brief Capture buffer * - * This is a set of functions to control a variable length capture record buffer. + * This is a set of functions to control a variable length capture + * record buffer. */ /* - ------------------------------------------------------------------------ - - COPYRIGHT (c) 2014. - On-Line Applications Research Corporation (OAR). - - Copyright 2016 Chris Johns <chrisj@rtems.org>. - All rights reserved. - - The license and distribution terms for this file may be - found in the file LICENSE in this distribution. - - This software with is provided ``as is'' and with NO WARRANTY. - - ------------------------------------------------------------------------ -*/ + * COPYRIGHT (c) 2014. + * On-Line Applications Research Corporation (OAR). + * + * Copyright 2016 Chris Johns <chrisj@rtems.org>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ #ifndef __CAPTURE_BUFFER_H_ #define __CAPTURE_BUFFER_H_ diff --git a/cpukit/libmisc/capture/capture_support.c b/cpukit/libmisc/capture/capture_support.c index e2438fb23b..5b685479d7 100644 --- a/cpukit/libmisc/capture/capture_support.c +++ b/cpukit/libmisc/capture/capture_support.c @@ -1,25 +1,42 @@ -/* - ------------------------------------------------------------------------ - - Copyright 2002, 2015 Chris Johns <chrisj@rtems.org> - All rights reserved. - - COPYRIGHT (c) 1989-2014. - On-Line Applications Research Corporation (OAR). - - The license and distribution terms for this file may be - found in the file LICENSE in this distribution. +/* SPDX-License-Identifier: BSD-2-Clause */ - This software with is provided ``as is'' and with NO WARRANTY. - - ------------------------------------------------------------------------ - - RTEMS Performance Monitoring and Measurement Framework. - - This is a set of print support routines that may be shared between - the RTEMS monitor and direct callers of the capture engine. +/** + * @file + * + * @brief RTEMS Performance Monitoring and Measurement Framework. + * + * This is a set of print support routines that may be shared between + * the RTEMS monitor and direct callers of the capture engine. + */ -*/ +/* + * Copyright 2002, 2015 Chris Johns <chrisj@rtems.org> + * All rights reserved. + * + * COPYRIGHT (c) 1989-2014. + * On-Line Applications Research Corporation (OAR). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/cpukit/libmisc/capture/capture_user_extension.c b/cpukit/libmisc/capture/capture_user_extension.c index ae4107afbc..19dcb83dbd 100644 --- a/cpukit/libmisc/capture/capture_user_extension.c +++ b/cpukit/libmisc/capture/capture_user_extension.c @@ -1,22 +1,40 @@ -/* - ------------------------------------------------------------------------ - - Copyright 2002, 2016 Chris Johns <chrisj@rtems.org>. All rights reserved. - - COPYRIGHT (c) 1989-2014. - On-Line Applications Research Corporation (OAR). - - The license and distribution terms for this file may be - found in the file LICENSE in this distribution. - - This software with is provided ``as is'' and with NO WARRANTY. - - ------------------------------------------------------------------------ - - RTEMS Performance Monitoring and Measurement Framework. +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief RTEMS Performance Monitoring and Measurement Framework. + * + * This is the Capture Engine component. + */ - This is the Capture Engine component. -*/ +/* + * Copyright 2002, 2016 Chris Johns <chrisj@rtems.org>. All rights reserved. + * + * COPYRIGHT (c) 1989-2014. + * On-Line Applications Research Corporation (OAR). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/cpukit/libmisc/capture/rtems-trace-buffer-default.c b/cpukit/libmisc/capture/rtems-trace-buffer-default.c index 23c66cdc88..fd9a9cc06b 100644 --- a/cpukit/libmisc/capture/rtems-trace-buffer-default.c +++ b/cpukit/libmisc/capture/rtems-trace-buffer-default.c @@ -1,9 +1,28 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /* * Copyright (c) 2015 Chris Johns <chrisj@rtems.org> * - * 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. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #include <rtems/trace/rtems-trace-buffer-vars.h> diff --git a/cpukit/libmisc/capture/rtems-trace-buffer-vars.c b/cpukit/libmisc/capture/rtems-trace-buffer-vars.c index ec24181253..5e565387d0 100644 --- a/cpukit/libmisc/capture/rtems-trace-buffer-vars.c +++ b/cpukit/libmisc/capture/rtems-trace-buffer-vars.c @@ -1,9 +1,28 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /* * Copyright (c) 2015 Chris Johns <chrisj@rtems.org> * - * 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. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #include <rtems/trace/rtems-trace-buffer-vars.h> diff --git a/cpukit/libmisc/cpuuse/cpuinforeport.c b/cpukit/libmisc/cpuuse/cpuinforeport.c index b51c9d7451..ac9ad10169 100644 --- a/cpukit/libmisc/cpuuse/cpuinforeport.c +++ b/cpukit/libmisc/cpuuse/cpuinforeport.c @@ -1,15 +1,28 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /* - * Copyright (c) 2016 embedded brains GmbH. All rights reserved. + * Copyright (c) 2016 embedded brains GmbH & Co. KG * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * - * 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 SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/cpuuse/cpuusagedata.c b/cpukit/libmisc/cpuuse/cpuusagedata.c index 0d06dd3e5c..fa39a6d754 100644 --- a/cpukit/libmisc/cpuuse/cpuusagedata.c +++ b/cpukit/libmisc/cpuuse/cpuusagedata.c @@ -1,20 +1,38 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /** * @file * - * @ingroup libmisc_cpuuse CPU Usage - * - * @brief CPU Usage Data + * @ingroup RTEMSImplCPUUsageReporting * - * CPU Usage Reporter - Shared Data + * @brief This source file contains the definition of + * ::CPU_usage_Uptime_at_last_reset. */ /* * COPYRIGHT (c) 1989-2009 * On-Line Applications Research Corporation (OAR). * - * 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. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/cpuuse/cpuusagereport.c b/cpukit/libmisc/cpuuse/cpuusagereport.c index ea21e73dc1..bdeee375e3 100644 --- a/cpukit/libmisc/cpuuse/cpuusagereport.c +++ b/cpukit/libmisc/cpuuse/cpuusagereport.c @@ -1,18 +1,38 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /** * @file * - * @ingroup libmisc_cpuuse CPU Usage + * @ingroup RTEMSImplCPUUsageReporting * - * @brief CPU Usage Report + * @brief This source file contains the definition of + * rtems_cpu_usage_report() and rtems_cpu_usage_report_with_plugin(). */ /* * COPYRIGHT (c) 1989-2010. * On-Line Applications Research Corporation (OAR). * - * 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. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/cpuuse/cpuusagereset.c b/cpukit/libmisc/cpuuse/cpuusagereset.c index d1f0e65180..e56ab3cded 100644 --- a/cpukit/libmisc/cpuuse/cpuusagereset.c +++ b/cpukit/libmisc/cpuuse/cpuusagereset.c @@ -1,18 +1,38 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /** * @file * - * @ingroup libmisc_cpuuse CPU Usage + * @ingroup RTEMSImplCPUUsageReporting * - * @brief CPU Usage Reset + * @brief This source file contains the definition of + * rtems_cpu_usage_reset(). */ /* * COPYRIGHT (c) 1989-2009 * On-Line Applications Research Corporation (OAR). * - * 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. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H @@ -20,6 +40,7 @@ #endif #include <rtems/cpuuse.h> +#include <rtems/rtems/scheduler.h> #include <rtems/score/percpu.h> #include <rtems/score/todimpl.h> #include <rtems/score/schedulerimpl.h> diff --git a/cpukit/libmisc/cpuuse/cpuusagetop.c b/cpukit/libmisc/cpuuse/cpuusagetop.c index 51d049257a..eed89ad211 100644 --- a/cpukit/libmisc/cpuuse/cpuusagetop.c +++ b/cpukit/libmisc/cpuuse/cpuusagetop.c @@ -1,9 +1,12 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /** * @file * - * @ingroup libmisc_cpuuse CPU Usage + * @ingroup RTEMSImplCPUUsageReporting * - * @brief CPU Usage Top + * @brief This source file contains the definition of + * rtems_cpu_usage_top() and rtems_cpu_usage_top_with_plugin(). */ /* @@ -12,9 +15,26 @@ * COPYRIGHT (c) 2014. * On-Line Applications Research Corporation (OAR). * - * 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. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ /* diff --git a/cpukit/libmisc/cpuuse/cpuuseimpl.h b/cpukit/libmisc/cpuuse/cpuuseimpl.h index 32184c3636..8c6c407b4b 100644 --- a/cpukit/libmisc/cpuuse/cpuuseimpl.h +++ b/cpukit/libmisc/cpuuse/cpuuseimpl.h @@ -1,10 +1,38 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup RTEMSImplCPUUsageReporting + * + * @brief This header file provides interfaces of the + * @ref RTEMSImplCPUUsageReporting implementation. + */ + /* * COPYRIGHT (c) 1989-2011. * On-Line Applications Research Corporation (OAR). * - * 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. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __RTEMS_CPUUSEIMPL_h @@ -16,8 +44,25 @@ extern "C" { #endif +/** + * @defgroup RTEMSImplCPUUsageReporting CPU Usage Reporting + * + * @ingroup RTEMSImpl + * + * @brief This group contains the implementation of + * @ref RTEMSAPICPUUsageReporting. + * + * @{ + */ + +/** + * @brief This object provides the uptime timestamp at the last CPU usage + * reset. + */ extern Timestamp_Control CPU_usage_Uptime_at_last_reset; +/** @} */ + #ifdef __cplusplus } #endif diff --git a/cpukit/libmisc/devnull/devzero.c b/cpukit/libmisc/devnull/devzero.c index a993e5c810..5be370b991 100644 --- a/cpukit/libmisc/devnull/devzero.c +++ b/cpukit/libmisc/devnull/devzero.c @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /** * @file * @@ -7,17 +9,28 @@ */ /* - * Copyright (c) 2011 embedded brains GmbH. All rights reserved. + * Copyright (c) 2011 embedded brains GmbH & Co. KG * - * embedded brains GmbH - * Obere Lagerstr. 30 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * - * 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 SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/dummy/default-configuration.c b/cpukit/libmisc/dummy/default-configuration.c index 9c30b270c2..62c6e98de7 100644 --- a/cpukit/libmisc/dummy/default-configuration.c +++ b/cpukit/libmisc/dummy/default-configuration.c @@ -1,12 +1,31 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /* * Default configuration file * * COPYRIGHT (c) 1989-2008. * On-Line Applications Research Corporation (OAR). * - * 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. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/dumpbuf/dumpbuf.c b/cpukit/libmisc/dumpbuf/dumpbuf.c index 7f8128259f..7973c5d2bf 100644 --- a/cpukit/libmisc/dumpbuf/dumpbuf.c +++ b/cpukit/libmisc/dumpbuf/dumpbuf.c @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /** * @file * @@ -10,9 +12,26 @@ * COPYRIGHT (c) 1997-2015. * On-Line Applications Research Corporation (OAR). * - * The license and distribution terms for this file may in - * the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/fsmount/fsmount.c b/cpukit/libmisc/fsmount/fsmount.c index 190d0dd511..df46b196dd 100644 --- a/cpukit/libmisc/fsmount/fsmount.c +++ b/cpukit/libmisc/fsmount/fsmount.c @@ -1,24 +1,41 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /** * @file * * @ingroup rtems_fstab File System Mount Support * * @brief File System Mount Functions - */ - -/* - * Copyright (c) 2003 IMD - * Ingenieurbuero fuer Microcomputertechnik Th. Doerfler - * <Thomas.Doerfler@imd-systems.de> - * all rights reserved * * This file contains the fsmount functions. These functions * are used to mount a list of filesystems (and create their mount * points before). + */ + +/* + * Copyright (c) 2003 IMD Ingenieurbuero fuer Microcomputertechnik + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * - * 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 SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifndef HAVE_CONFIG_H diff --git a/cpukit/libmisc/monitor/mon-command.c b/cpukit/libmisc/monitor/mon-command.c index 64b102b8f9..9ba78ccdf9 100644 --- a/cpukit/libmisc/monitor/mon-command.c +++ b/cpukit/libmisc/monitor/mon-command.c @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /** * @file * @@ -5,15 +7,28 @@ */ /* - * 2001-01-30 KJO (vac4050@cae597.rsc.raytheon.com): - * Fixed rtems_monitor_command_lookup() to accept partial - * commands to uniqeness. Added support for setting - * the monitor prompt via an environment variable: - * RTEMS_MONITOR_PROMPT + * COPYRIGHT (c) 2000 Chris Johns <chrisj@rtems.org> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * - * CCJ: 26-3-2000, adding command history and command line - * editing. This code is donated from My Right Boot and not - * covered by GPL, only the RTEMS license. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/monitor/mon-config.c b/cpukit/libmisc/monitor/mon-config.c index d7728de33a..0f173bf6ee 100644 --- a/cpukit/libmisc/monitor/mon-config.c +++ b/cpukit/libmisc/monitor/mon-config.c @@ -1,7 +1,34 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief RTEMS Config display support + */ + /* - * RTEMS Config display support + * COPYRIGHT (c) 1989-2022. On-Line Applications Research Corporation (OAR). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * - * TODO + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/monitor/mon-driver.c b/cpukit/libmisc/monitor/mon-driver.c index e2e95ff23a..38c04c5743 100644 --- a/cpukit/libmisc/monitor/mon-driver.c +++ b/cpukit/libmisc/monitor/mon-driver.c @@ -1,5 +1,9 @@ -/* - * RTEMS monitor IO (device drivers) support +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief RTEMS monitor IO (device drivers) support * * There are 2 "driver" things the monitor knows about. * @@ -17,6 +21,31 @@ * Names are displayed with 'name' command. */ +/* + * COPYRIGHT (c) 1989-2022. On-Line Applications Research Corporation (OAR). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + #ifdef HAVE_CONFIG_H #include "config.h" #endif diff --git a/cpukit/libmisc/monitor/mon-editor.c b/cpukit/libmisc/monitor/mon-editor.c index 6957fee9c8..4bc5064ad2 100644 --- a/cpukit/libmisc/monitor/mon-editor.c +++ b/cpukit/libmisc/monitor/mon-editor.c @@ -5,15 +5,28 @@ */ /* - * 2001-01-30 KJO (vac4050@cae597.rsc.raytheon.com): - * Fixed rtems_monitor_command_lookup() to accept partial - * commands to uniqeness. Added support for setting - * the monitor prompt via an environment variable: - * RTEMS_MONITOR_PROMPT + * COPYRIGHT (c) 2000 Chris Johns <chrisj@rtems.org> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * - * CCJ: 26-3-2000, adding command history and command line - * editing. This code is donated from My Right Boot and not - * covered by GPL, only the RTEMS license. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/monitor/mon-extension.c b/cpukit/libmisc/monitor/mon-extension.c index 029d26c4c1..53bfe320b1 100644 --- a/cpukit/libmisc/monitor/mon-extension.c +++ b/cpukit/libmisc/monitor/mon-extension.c @@ -1,5 +1,34 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief RTEMS Monitor extension support + */ + /* - * RTEMS Monitor extension support + * COPYRIGHT (c) 1989-2022. On-Line Applications Research Corporation (OAR). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/monitor/mon-itask.c b/cpukit/libmisc/monitor/mon-itask.c index f4d3aea170..262fc0748c 100644 --- a/cpukit/libmisc/monitor/mon-itask.c +++ b/cpukit/libmisc/monitor/mon-itask.c @@ -1,5 +1,34 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief RTEMS Monitor init task support + */ + /* - * RTEMS Monitor init task support + * COPYRIGHT (c) 1989-2022. On-Line Applications Research Corporation (OAR). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/monitor/mon-manager.c b/cpukit/libmisc/monitor/mon-manager.c index d165c4fccd..1e2cc2feb1 100644 --- a/cpukit/libmisc/monitor/mon-manager.c +++ b/cpukit/libmisc/monitor/mon-manager.c @@ -1,8 +1,38 @@ -/* - * RTEMS Monitor "manager" support. +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief RTEMS Monitor "manager" support. + * * Used to traverse object (chain) lists and print them out. */ +/* + * COPYRIGHT (c) 1989-2022. On-Line Applications Research Corporation (OAR). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + #ifdef HAVE_CONFIG_H #include "config.h" #endif diff --git a/cpukit/libmisc/monitor/mon-monitor.c b/cpukit/libmisc/monitor/mon-monitor.c index 9c099dc57c..0d5337f8c6 100644 --- a/cpukit/libmisc/monitor/mon-monitor.c +++ b/cpukit/libmisc/monitor/mon-monitor.c @@ -1,5 +1,9 @@ -/* - * RTEMS monitor main body +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief RTEMS monitor main body * * TODO: * add stuff to RTEMS api @@ -20,6 +24,30 @@ * interrupt config stuff */ +/* + * COPYRIGHT (c) 1989-2022. On-Line Applications Research Corporation (OAR). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ #ifdef HAVE_CONFIG_H #include "config.h" #endif diff --git a/cpukit/libmisc/monitor/mon-mpci.c b/cpukit/libmisc/monitor/mon-mpci.c index f6914aa525..033a99732a 100644 --- a/cpukit/libmisc/monitor/mon-mpci.c +++ b/cpukit/libmisc/monitor/mon-mpci.c @@ -1,7 +1,34 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief RTEMS MPCI Config display support + */ + /* - * RTEMS MPCI Config display support + * COPYRIGHT (c) 1989-2022. On-Line Applications Research Corporation (OAR). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * - * TODO + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/monitor/mon-object.c b/cpukit/libmisc/monitor/mon-object.c index 039d11fd74..fecf9008fd 100644 --- a/cpukit/libmisc/monitor/mon-object.c +++ b/cpukit/libmisc/monitor/mon-object.c @@ -1,5 +1,9 @@ -/* - * RTEMS Monitor "object" support. +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief RTEMS Monitor "object" support. * * Used to traverse object lists and print them out. * An object can be an RTEMS object (chain based stuff) or @@ -13,6 +17,31 @@ * should allow for non-numeric id's??? */ +/* + * COPYRIGHT (c) 1989-2022. On-Line Applications Research Corporation (OAR). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + #ifdef HAVE_CONFIG_H #include "config.h" #endif diff --git a/cpukit/libmisc/monitor/mon-part.c b/cpukit/libmisc/monitor/mon-part.c index 654700ebfc..e049f4a6ab 100644 --- a/cpukit/libmisc/monitor/mon-part.c +++ b/cpukit/libmisc/monitor/mon-part.c @@ -1,5 +1,34 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief RTEMS Monitor partition support + */ + /* - * RTEMS Monitor partition support + * COPYRIGHT (c) 1989-2022. On-Line Applications Research Corporation (OAR). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/monitor/mon-prmisc.c b/cpukit/libmisc/monitor/mon-prmisc.c index 97862ff22c..d7b36279bc 100644 --- a/cpukit/libmisc/monitor/mon-prmisc.c +++ b/cpukit/libmisc/monitor/mon-prmisc.c @@ -1,8 +1,36 @@ -/* - * Print misc stuff for the monitor dump routines +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief Print misc stuff for the monitor dump routines + * * Each routine returns the number of characters it output. + */ + +/* + * COPYRIGHT (c) 1989-2022. On-Line Applications Research Corporation (OAR). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * - * TODO: + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/monitor/mon-queue.c b/cpukit/libmisc/monitor/mon-queue.c index aadfcd3989..374ce52229 100644 --- a/cpukit/libmisc/monitor/mon-queue.c +++ b/cpukit/libmisc/monitor/mon-queue.c @@ -1,3 +1,36 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief Monitor Support for Message Queues + */ + +/* + * COPYRIGHT (c) 1989-2022. On-Line Applications Research Corporation (OAR). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + #ifdef HAVE_CONFIG_H #include "config.h" #endif diff --git a/cpukit/libmisc/monitor/mon-region.c b/cpukit/libmisc/monitor/mon-region.c index ece6a6a788..4b894ae392 100644 --- a/cpukit/libmisc/monitor/mon-region.c +++ b/cpukit/libmisc/monitor/mon-region.c @@ -1,5 +1,34 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief RTEMS Monitor region support + */ + /* - * RTEMS Monitor region support + * COPYRIGHT (c) 1989-2022. On-Line Applications Research Corporation (OAR). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/monitor/mon-sema.c b/cpukit/libmisc/monitor/mon-sema.c index fabc3c952b..58eab14d5a 100644 --- a/cpukit/libmisc/monitor/mon-sema.c +++ b/cpukit/libmisc/monitor/mon-sema.c @@ -1,5 +1,34 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief RTEMS Monitor semaphore support + */ + /* - * RTEMS Monitor semaphore support + * COPYRIGHT (c) 1989-2022. On-Line Applications Research Corporation (OAR). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/monitor/mon-server.c b/cpukit/libmisc/monitor/mon-server.c index d8a1687f0b..579fc775a2 100644 --- a/cpukit/libmisc/monitor/mon-server.c +++ b/cpukit/libmisc/monitor/mon-server.c @@ -1,6 +1,37 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief RTEMS monitor server + * + * This handles requests for info from RTEMS monitors running on + * other nodes. + */ + /* - * RTEMS monitor server (handles requests for info from RTEMS monitors - * running on other nodes) + * COPYRIGHT (c) 1989-2022. On-Line Applications Research Corporation (OAR). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/monitor/mon-symbols.c b/cpukit/libmisc/monitor/mon-symbols.c index d3f0befdfd..1f59493605 100644 --- a/cpukit/libmisc/monitor/mon-symbols.c +++ b/cpukit/libmisc/monitor/mon-symbols.c @@ -1,12 +1,36 @@ -/* - * File: symbols.c +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief Symbol table manager for the RTEMS monitor * - * Description: - * Symbol table manager for the RTEMS monitor. - * These routines may be used by other system resources also. + * These routines may be used by other system resources also. + */ + +/* + * COPYRIGHT (c) 1989-2022. On-Line Applications Research Corporation (OAR). * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * - * TODO: + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/monitor/mon-task.c b/cpukit/libmisc/monitor/mon-task.c index bb2c49e77f..0e925a1751 100644 --- a/cpukit/libmisc/monitor/mon-task.c +++ b/cpukit/libmisc/monitor/mon-task.c @@ -1,5 +1,34 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief RTEMS Monitor task support + */ + /* - * RTEMS Monitor task support + * COPYRIGHT (c) 1989-2022. On-Line Applications Research Corporation (OAR). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/monitor/symbols.h b/cpukit/libmisc/monitor/symbols.h index 1455edbcd7..7d330bab81 100644 --- a/cpukit/libmisc/monitor/symbols.h +++ b/cpukit/libmisc/monitor/symbols.h @@ -1,12 +1,36 @@ -/* - * RTEMS monitor symbol table functions +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file * - * Description: - * Entry points for symbol table routines. + * @brief RTEMS monitor symbol table functions * + * Entry points for symbol table routines. + */ + +/* + * COPYRIGHT (c) 1989-2022. On-Line Applications Research Corporation (OAR). * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * - * TODO: + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifndef _INCLUDE_SYMBOLS_H diff --git a/cpukit/libmisc/mouse/serial_mouse.c b/cpukit/libmisc/mouse/serial_mouse.c index 53a174df57..adf57449d5 100644 --- a/cpukit/libmisc/mouse/serial_mouse.c +++ b/cpukit/libmisc/mouse/serial_mouse.c @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /** * @file * @@ -10,9 +12,26 @@ * COPYRIGHT (c) 1989-2011. * On-Line Applications Research Corporation (OAR). * - * 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. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #include <stdio.h> diff --git a/cpukit/libmisc/redirector/stdio-redirect.c b/cpukit/libmisc/redirector/stdio-redirect.c index 7f3e9138a7..124cc47f5b 100644 --- a/cpukit/libmisc/redirector/stdio-redirect.c +++ b/cpukit/libmisc/redirector/stdio-redirect.c @@ -1,14 +1,34 @@ -/* - * Copyright (C) 2014 Chris Johns (chrisj@rtems.org) - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution. +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file * - * This software with is provided ``as is'' and with NO WARRANTY. + * @brief RTEMS std redirector. */ /* - * RTEMS std redirector. + * Copyright (C) 2014 Chris Johns (chrisj@rtems.org) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #include <errno.h> diff --git a/cpukit/libmisc/regulator/regulator.c b/cpukit/libmisc/regulator/regulator.c new file mode 100644 index 0000000000..97a48be4f5 --- /dev/null +++ b/cpukit/libmisc/regulator/regulator.c @@ -0,0 +1,680 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief Regulator Library Implementation + */ + +/* + * Copyright (C) 2022 On-Line Applications Research Corporation (OAR) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <stdlib.h> + +#include <rtems.h> +#include <rtems/regulator.h> +#include <string.h> + +#include <rtems/regulatorimpl.h> + +/** + * @ingroup RegulatorInternalAPI + * + * This method is the body for the task which delivers the output for + * this regulator instance at the configured rate. + * + * @param[in] arg points to the regulator instance this thread + * is associated with + * + * @note The argument passed in cannot be NULL if the + * rtems_regulator_create worked. + */ +static rtems_task _Regulator_Output_task_body( + rtems_task_argument arg +) +{ + _Regulator_Control *the_regulator = (_Regulator_Control *)arg; + rtems_status_code sc; + size_t to_dequeue; + _Regulator_Message_t regulator_message; + size_t regulator_message_size; + bool release_it; + + the_regulator->delivery_thread_is_running = true; + + /** + * This thread uses a rate monotonic period object instance. A rate + * monotonic period object must be created by the thread using it. + * It can be deleted by any thread which simplifies clean up. + * + * The rate_monotonic_create() call can fail if the application + * is incorrectly configured. This thread has no way to report the + * failure. If it continues with an invalid id, then the thread will + * not block on the period and spin continuously consuming CPU. The only + * alternatives are to invoke rtems_fatal_error_occurred() or silently + * exit the thread. + */ + sc = rtems_rate_monotonic_create( + rtems_build_name('P', 'E', 'R', 'D'), + &the_regulator->delivery_thread_period_id + ); + if (sc != RTEMS_SUCCESSFUL) { + goto exit_delivery_thread; + } + + /** + * Loop on the rate_monotonic_period() based on the specified period. + */ + while (1) { + sc = rtems_rate_monotonic_period( + the_regulator->delivery_thread_period_id, + the_regulator->Attributes.delivery_thread_period + ); + _Assert_Unused_variable_equals(sc, RTEMS_SUCCESSFUL); + + /** + * If the delivery thread has been requested to exit, then + * quit processing messages, break out of this loop, and exit + * this thread. + */ + if (the_regulator->delivery_thread_request_exit) { + break; + } + + /** + * Loop for the configured number of messages to deliver per period. + * If we reach the point, there are no more messages, block for the + * rest of this period. If there are messages, deliver them. + */ + for (to_dequeue = 0; + to_dequeue < the_regulator->Attributes.maximum_to_dequeue_per_period; + to_dequeue++) { + regulator_message_size = sizeof(_Regulator_Message_t); + sc = rtems_message_queue_receive( + the_regulator->queue_id, + ®ulator_message, + ®ulator_message_size, + RTEMS_NO_WAIT, + 0 + ); + _Assert_Unused_variable_equals(sc, RTEMS_SUCCESSFUL); + if (sc != RTEMS_SUCCESSFUL) { + break; + } + + release_it = the_regulator->Attributes.deliverer( + the_regulator->Attributes.deliverer_context, + regulator_message.buffer, + regulator_message.length + ); + + the_regulator->Statistics.delivered++; + + /** + * The message was successfully delivered. If the delivery function + * wants the buffer returned, do it now. The delivery to the Destination + * may involve handing the buffer off to something like DMA + * and need to wait for it to complete before releasing the buffer. + * + * Note that this is the underlying RTEMS service + * used by @a rtems_regulator_obtain_buffer() and @a + * rtems_regulator_release_buffer(). + */ + if (release_it == true) { + the_regulator->Statistics.released++; + sc = rtems_partition_return_buffer( + the_regulator->messages_partition_id, + regulator_message.buffer + ); + _Assert_Unused_variable_equals(sc, RTEMS_SUCCESSFUL); + } + } + } + + /** + * This thread was requested to exit. Do so. + */ +exit_delivery_thread: + the_regulator->delivery_thread_is_running = false; + the_regulator->delivery_thread_has_exited = true; + + (void) rtems_rate_monotonic_delete(the_regulator->delivery_thread_period_id); + + rtems_task_exit(); +} + +/** + * @ingroup RegulatorInternalAPI + * + * This method frees the resources associated with a regulator instance. + * The resources are freed in the opposite of the order in which they are + * allocated. This is used on error cases in @a rtems_regulator_create() and in + * @a rtems_regulator_delete(). + * + * @param[in] the_regulator is the instance to operate upon + * @param[in] ticks is the length of time to wait for the delivery thread + * to exit + * + * @return This method returns true is successful and false on timeout. + */ +static bool _Regulator_Free_helper( + _Regulator_Control *the_regulator, + rtems_interval ticks +) +{ + rtems_status_code sc; + + + /* + * If the output thread has not started running, then we can just delete it. + */ + + if (ticks == 0 || the_regulator->delivery_thread_is_running == false) { + sc = rtems_task_delete(the_regulator->delivery_thread_id); + _Assert_Unused_variable_equals(sc, RTEMS_SUCCESSFUL); + } else { + rtems_interval remaining = ticks; + + the_regulator->delivery_thread_request_exit = true; + + while (1) { + if (the_regulator->delivery_thread_has_exited) { + break; + } + + if (remaining == 0) { + return false; + } + + (void) rtems_task_wake_after(1); + remaining--; + } + } + + /* + * The output thread deletes the rate monotonic period that it created. + */ + + /* + * The regulator's message_queue_storage is implicitly freed by this call. + */ + sc = rtems_message_queue_delete(the_regulator->queue_id); + _Assert_Unused_variable_equals(sc, RTEMS_SUCCESSFUL); + + sc = rtems_partition_delete(the_regulator->messages_partition_id); + _Assert_Unused_variable_equals(sc, RTEMS_SUCCESSFUL); + + if (the_regulator->message_memory) { + free(the_regulator->message_memory); + } + + the_regulator->initialized = 0; + free(the_regulator); + return true; +} + +/** + * @ingroup RegulatorInternalAPI + */ +rtems_status_code rtems_regulator_create( + rtems_regulator_attributes *attributes, + rtems_regulator_instance **regulator +) +{ + _Regulator_Control *the_regulator; + rtems_status_code sc; + size_t alloc_size; + + /** + * Perform basic validation of parameters + */ + if (attributes == NULL) { + return RTEMS_INVALID_ADDRESS; + } + + if (regulator == NULL) { + return RTEMS_INVALID_ADDRESS; + } + + /** + * Verify attributes are OK. Some are checked by calls to object create + * methods. Specifically the following are not checked: + * + * - delivery_thread_priority by rtems_task_create() + * - delivery_thread_stack_size can be any value + */ + if (attributes->deliverer == NULL) { + return RTEMS_INVALID_ADDRESS; + } + + if (attributes->maximum_messages == 0) { + return RTEMS_INVALID_NUMBER; + } + + if (attributes->maximum_message_size == 0) { + return RTEMS_INVALID_SIZE; + } + + if (attributes->maximum_to_dequeue_per_period == 0) { + return RTEMS_INVALID_NUMBER; + } + + if (attributes->delivery_thread_period == 0) { + return RTEMS_INVALID_NUMBER; + } + + /** + * Allocate memory for regulator instance + */ + the_regulator = (_Regulator_Control *) calloc(sizeof(_Regulator_Control), 1); + if (the_regulator == NULL) { + return RTEMS_NO_MEMORY; + } + + /** + * We do NOT want the delivery_thread_id field to be initialized to 0. If the + * @a rtems_task_create() fails, then the field will not be overwritten. + * This results in an attempt to rtems_task_delete(0) during clean + * up. The thread ID of 0 is self which results in the calling thread + * accidentally deleting itself. + */ + the_regulator->delivery_thread_id = (rtems_id) -1; + + /** + * Copy the attributes to an internal area for later use + */ + the_regulator->Attributes = *attributes; + + /** + * Allocate memory for the messages. There is no need to zero out the + * message memory because the user should fill that in. + */ + alloc_size = attributes->maximum_message_size * attributes->maximum_messages; + the_regulator->message_memory = calloc(alloc_size, 1); + if (the_regulator->message_memory == NULL) { + _Regulator_Free_helper(the_regulator, 0); + return RTEMS_NO_MEMORY; + } + + /** + * Associate message memory with a partition so allocations are atomic + */ + sc = rtems_partition_create( + rtems_build_name('P', 'O', 'O', 'L'), + the_regulator->message_memory, + alloc_size, + attributes->maximum_message_size, + RTEMS_DEFAULT_ATTRIBUTES, + &the_regulator->messages_partition_id + ); + if (sc != RTEMS_SUCCESSFUL) { + _Regulator_Free_helper(the_regulator, 0); + return sc; + } + + /** + * Create the message queue between the sender and output thread + */ + RTEMS_MESSAGE_QUEUE_BUFFER(sizeof(_Regulator_Message_t)) regulator_message_t; + + size_t storage_size = sizeof(regulator_message_t) * attributes->maximum_messages; + + the_regulator->message_queue_storage = malloc(storage_size); + if (the_regulator->message_queue_storage == NULL) { + _Regulator_Free_helper(the_regulator, 0); + return RTEMS_NO_MEMORY; + } + + rtems_message_queue_config mq_config = { + .name = rtems_build_name('S', 'N', 'D', 'Q'), + .maximum_pending_messages = attributes->maximum_messages, + .maximum_message_size = sizeof(_Regulator_Message_t), + .storage_area = the_regulator->message_queue_storage, + .storage_size = storage_size, + .storage_free = free, + .attributes = RTEMS_DEFAULT_ATTRIBUTES + }; + sc = rtems_message_queue_construct( + &mq_config, + &the_regulator->queue_id + ); + if (sc != RTEMS_SUCCESSFUL) { + _Regulator_Free_helper(the_regulator, 0); + return sc; + } + + /** + * @note A rate monotonic period object must be created by the thread + * using it. Thus that specific create operation is not included + * in this method. All other resources are allocated here. + */ + + /** + * Create the output thread Using the priority and stack size attributes + * specified by the user. + */ + sc = rtems_task_create( + rtems_build_name('R', 'E', 'G', 'U'), + attributes->delivery_thread_priority, + attributes->delivery_thread_stack_size, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + &the_regulator->delivery_thread_id + ); + if (sc != RTEMS_SUCCESSFUL) { + _Regulator_Free_helper(the_regulator, 0); + return sc; + } + + /** + * Start the output thread. + * + * @note There should be no way this call can fail. The task id is valid, + * the regulator output thread entry point is valid, and the argument + * is valid. + */ + the_regulator->delivery_thread_is_running = true; + the_regulator->delivery_thread_request_exit = false; + the_regulator->delivery_thread_has_exited = false; + + sc = rtems_task_start( + the_regulator->delivery_thread_id, + _Regulator_Output_task_body, + (rtems_task_argument) the_regulator + ); + _Assert_Unused_variable_equals(sc, RTEMS_SUCCESSFUL); + + /** + * The regulator is successfully initialized. Set the initialized field + * to reflect this and return the instance pointer. + */ + the_regulator->initialized = REGULATOR_INITIALIZED; + + *regulator = (void *)the_regulator; + + return RTEMS_SUCCESSFUL; +} + +/** + * @brief Validate the regulator instance provided by the user + * + * Validate the regulator instance provided by the user + * + * @param[in] regulator is the instance provided by the user + * @param[inout] status will contain the RTEMS status for this check + * + * @return This method returns a @a _Regulator_Control instance pointer + * which is NULL if invalid or points to the internal regulator + * control structure if valid. + */ +static inline _Regulator_Control *_Regulator_Get( + rtems_regulator_instance *regulator, + rtems_status_code *status +) +{ + _Regulator_Control *the_regulator = (_Regulator_Control *) regulator; + + if (the_regulator == NULL) { + *status = RTEMS_INVALID_ADDRESS; + return NULL; + } + + if (the_regulator->initialized != REGULATOR_INITIALIZED) { + *status = RTEMS_INCORRECT_STATE; + return NULL; + } + + status = RTEMS_SUCCESSFUL; + return the_regulator; +} + +/** + * @ingroup RegulatorInternalAPI + */ +rtems_status_code rtems_regulator_delete( + rtems_regulator_instance *regulator, + rtems_interval ticks +) +{ + _Regulator_Control *the_regulator; + rtems_status_code status; + + /** + * Convert external handle to internal instance pointer + */ + the_regulator = _Regulator_Get(regulator, &status); + if (the_regulator == NULL) { + return status; + } + + /** + * There can be no buffers outstanding + */ + _Regulator_Statistics *stats = &the_regulator->Statistics; + + if (stats->obtained != stats->released ) { + return RTEMS_RESOURCE_IN_USE; + } + + /** + * Free the resources associated with this regulator instance. + */ + bool bc; + bc = _Regulator_Free_helper(the_regulator, ticks); + if (bc == false) { + return RTEMS_TIMEOUT; + } + + return RTEMS_SUCCESSFUL; +} + +/** + * @ingroup RegulatorInternalAPI + * + * Allocate a buffer for the caller using the internal partition. + */ +rtems_status_code rtems_regulator_obtain_buffer( + rtems_regulator_instance *regulator, + void **buffer +) +{ + _Regulator_Control *the_regulator; + rtems_status_code status; + + /** + * Convert external handle to internal instance pointer + */ + the_regulator = _Regulator_Get(regulator, &status); + if (the_regulator == NULL) { + return status; + } + + /** + * Allocate a buffer for the user application from the buffer pool managed + * by an Classic API partition. + */ + status = rtems_partition_get_buffer( + the_regulator->messages_partition_id, + buffer + ); + + if (status == RTEMS_SUCCESSFUL) { + the_regulator->Statistics.obtained++; + } + + return status; +} + +/** + * @ingroup RegulatorInternalAPI + * + * Allocate a buffer for the caller using the internal partition. + */ +rtems_status_code rtems_regulator_release_buffer( + rtems_regulator_instance *regulator, + void *buffer +) +{ + _Regulator_Control *the_regulator; + rtems_status_code status; + + /** + * Convert external handle to internal instance pointer + */ + the_regulator = _Regulator_Get(regulator, &status); + if (the_regulator == NULL) { + return status; + } + + /** + * Deallocate the buffer to the buffer pool managed by a Classic + * API partition. + */ + status = rtems_partition_return_buffer( + the_regulator->messages_partition_id, + buffer + ); + + if (status == RTEMS_SUCCESSFUL) { + the_regulator->Statistics.released++; + } + + return status; +} + +/** + * @ingroup RegulatorInternalAPI + */ +rtems_status_code rtems_regulator_send( + rtems_regulator_instance *regulator, + void *message, + size_t length +) +{ + _Regulator_Control *the_regulator; + rtems_status_code status; + _Regulator_Message_t regulator_message; + + the_regulator = (_Regulator_Control *) regulator; + + /** + * Validate the arguments and ensure the regulator was successfully + * initialized. + */ + if (message == NULL) { + return RTEMS_INVALID_ADDRESS; + } + + if (length == 0) { + return RTEMS_INVALID_NUMBER; + } + + /** + * Convert external handle to internal instance pointer + */ + the_regulator = _Regulator_Get(regulator, &status); + if (the_regulator == NULL) { + return status; + } + + /** + * Place the message pointer and length into a temporary structure. This + * lets the implementation internally send the message by reference and + * have a zero-copy implementation. + */ + regulator_message.buffer = message; + regulator_message.length = length; + + /** + * Send the application message to the output thread for delivery using + * a Classic API message queue. + */ + status = rtems_message_queue_send( + the_regulator->queue_id, + ®ulator_message, + sizeof(_Regulator_Message_t) + ); + if (status != RTEMS_SUCCESSFUL) { + return status; + } + + return status; +} + +/** + * @ingroup RegulatorInternalAPI + */ +rtems_status_code rtems_regulator_get_statistics( + rtems_regulator_instance *regulator, + rtems_regulator_statistics *statistics +) +{ + _Regulator_Control *the_regulator; + rtems_status_code status; + + /** + * Validate the arguments and ensure the regulator was successfully + * initialized. + */ + if (statistics == NULL) { + return RTEMS_INVALID_ADDRESS; + } + + /** + * Convert external handle to internal instance pointer + */ + the_regulator = _Regulator_Get(regulator, &status); + if (the_regulator == NULL) { + return status; + } + + /** + * Zero out the statistics structure in case the get period statistics + * fails below. + */ + memset(statistics, 0, sizeof(rtems_regulator_statistics)); + + /** + * Fill in the caller's statistics structure from information + * maintained by the regulator instance about buffers processed. + */ + statistics->obtained = the_regulator->Statistics.obtained; + statistics->released = the_regulator->Statistics.released; + statistics->delivered = the_regulator->Statistics.delivered; + + /** + * Attempt to retrieve the delivery thread's period's statistics. + * + * NOTE; If the Delivery Thread has not run yet, the period will not + * exist yet. We should not fail for this reason but it is why + * we zeroed out the entire structure above. + */ + (void) rtems_rate_monotonic_get_statistics( + the_regulator->delivery_thread_period_id, + &statistics->period_statistics + ); + + return RTEMS_SUCCESSFUL; +} diff --git a/cpukit/libmisc/rtems-fdt/rtems-fdt-shell.c b/cpukit/libmisc/rtems-fdt/rtems-fdt-shell.c index 61f20765e0..0bf6c84208 100644 --- a/cpukit/libmisc/rtems-fdt/rtems-fdt-shell.c +++ b/cpukit/libmisc/rtems-fdt/rtems-fdt-shell.c @@ -1,9 +1,28 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /* * COPYRIGHT (c) 2013-2017 Chris Johns <chrisj@rtems.org> * - * 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. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ /** * @file @@ -108,32 +127,6 @@ rtems_fdt_get_value32 (const char* path, size_t size, uint32_t* value) { - const void* prop; - int node; - int length; - - node = rtems_fdt_path_offset(&cmd_fdt_handle, path); - if (node < 0) - { - rtems_fdt_check_error (node, "path lookup", path); - return false; - } - - prop = rtems_fdt_getprop(&cmd_fdt_handle, node, property, &length); - if (length < 0) - { - rtems_fdt_check_error (length, "get property", path); - return false; - } - - if (length != sizeof (uint32_t)) - { - printf ("error: property is not sizeof(uint32_t): %s\n", path); - return false; - } - - *value = rtems_fdt_get_uint32 (prop); - return true; } @@ -166,7 +159,10 @@ rtems_fdt_shell_ls (int argc, char *argv[]) bool debug = false; int arg = 1; size_t path_len = 0; + int total_entries = 0; int num_entries = 0; + int max_name_len = 0; + int name_offset = 0; int i = 0; while (arg < argc) @@ -201,10 +197,15 @@ rtems_fdt_shell_ls (int argc, char *argv[]) ++arg; } - if (!path) + if (path == NULL) { path = ""; } + else + { + if (path[0] != '/') + name_offset = 1; + } /* Eliminate trailing slashes. */ path_len = strlen (path); @@ -212,45 +213,99 @@ rtems_fdt_shell_ls (int argc, char *argv[]) if (path_len > 0 && path[path_len - 1] == '/') path_len--; - /* Loop through the entries, looking for matches. */ - num_entries = rtems_fdt_num_entries(&cmd_fdt_handle); - printf("Total: %d\n", num_entries); - for (i = 0; i < num_entries; i++) + /* Loop through the entries to get the mac name len. */ + total_entries = rtems_fdt_num_entries(&cmd_fdt_handle); + + for (i = 0; i < total_entries; i++) { /* Add it to the result set. */ const char *name = rtems_fdt_entry_name(&cmd_fdt_handle, i); size_t name_len = strlen(name); - if ((name_len > path_len) && - ((strncmp (path, name, path_len) == 0) && (name[path_len] == '/')) && - (recursive || (index(&name[path_len+1], '/') == 0))) + if ((name_len >= path_len + name_offset) && + ((strncmp (path, name + name_offset, path_len) == 0) && + ((name[path_len + name_offset] == '/' || + name[path_len + name_offset] == '\0'))) && + (recursive || name_len == path_len + name_offset || + (strchr(&name[path_len + name_offset + 1], '/') == NULL))) { + ++num_entries; if (long_path) { - printf ("%s", name); + if (name_len > max_name_len) + { + max_name_len = name_len; + } } else if (name_len != path_len) { - printf ("%s", &name[path_len + 1]); + if (name_len - path_len > max_name_len) + { + max_name_len = name_len - path_len; + } + } + } + } + + printf("Total: %d of %d\n", num_entries, total_entries); + + for (i = 0; i < total_entries; i++) + { + /* Add it to the result set. */ + const char *name = rtems_fdt_entry_name(&cmd_fdt_handle, i); + size_t name_len = strlen(name); + + if ((name_len >= path_len + name_offset) && + ((strncmp (path, name + name_offset, path_len) == 0) && + ((name[path_len + name_offset] == '/' || + name[path_len + name_offset] == '\0'))) && + (recursive || name_len == path_len + name_offset || + (strchr(&name[path_len + name_offset + 1], '/') == NULL))) + { + const char* print_name = "."; + + if (long_path) + { + print_name = name + name_offset; } + else if (name_len != path_len + name_offset) + { + print_name = &name[path_len + name_offset + 1]; + } + + printf ("%-*s", max_name_len, print_name); if (debug) { /* Get properties if we're in debug mode. */ - int proplen = 0; - int offset = rtems_fdt_entry_offset(&cmd_fdt_handle, i); - const void *prop = rtems_fdt_getprop(&cmd_fdt_handle, offset, "reg", &proplen); - const void *prop2 = rtems_fdt_getprop(&cmd_fdt_handle, offset, "mask", &proplen); - - if (prop) + int printed = 0; + const int noffset = rtems_fdt_entry_offset(&cmd_fdt_handle, i); + int poffset = rtems_fdt_first_prop_offset(&cmd_fdt_handle, noffset); + int address_cells = + rtems_fdt_getprop_address_cells(&cmd_fdt_handle, noffset); + int size_cells = rtems_fdt_getprop_size_cells(&cmd_fdt_handle, noffset); + printf("cells(a:%d s:%d) ", address_cells, size_cells); + while (poffset >= 0) { - printf(" addr 0x%08" PRIx32, *(uint32_t *)prop); - } - - proplen = 0; - if (prop2) - { - printf(" mask 0x%08" PRIx32, *(uint32_t *)prop2); + int plen = 0; + const char* pname = NULL; + const uint8_t *pvalue = + rtems_fdt_getprop_by_offset(&cmd_fdt_handle, poffset, &pname, &plen); + if (pvalue != NULL) + { + int b; + if (printed > 0) + printf(","); + ++printed; + printf(" %s %i:", pname, plen); + for (b = 0; b < plen; ++b) + { + if (b > 0 && (b % 4) == 0) + printf(" "); + printf("%02" PRIx8, *pvalue++); + } + } + poffset = rtems_fdt_next_prop_offset(&cmd_fdt_handle, poffset); } } @@ -264,9 +319,11 @@ rtems_fdt_shell_ls (int argc, char *argv[]) static int rtems_fdt_shell_wr (int argc, char *argv[]) { - uint32_t address; - uint32_t offset = 0; - uint32_t value; + rtems_fdt_address_map addr_map; + uint64_t offset = 0; + uint32_t value; + int fmt; + int r; if ((argc < 3) || (argc > 4)) return rtems_fdt_wrong_number_of_args (); @@ -277,18 +334,30 @@ rtems_fdt_shell_wr (int argc, char *argv[]) } else { - offset = strtoul (argv[2], 0, 0); + offset = strtoull (argv[2], 0, 0); value = strtoul (argv[3], 0, 0); } - if (!rtems_fdt_get_value32 (argv[1], "reg", sizeof (uint32_t), &address)) + r = rtems_fdt_getprop_address_map(&cmd_fdt_handle, argv[1], "reg", &addr_map); + if (r < 0) + { + printf("error: invalid reg address map: %d: %s\n", -r, argv[1]); return 1; + } - address += offset; + if (offset >= addr_map.size) + { + printf("error: offset out of range: %" PRIu64 ": %s\n", addr_map.size, argv[1]); + return 1; + } + + addr_map.address += offset; - printf ("0x%08" PRIx32 " <= 0x%08" PRIx32 "\n", address, value); + fmt = addr_map.address >= 0x0000000100000000ULL ? 16 : 8; - rtems_fdt_write (address, value); + printf ("0x%0*" PRIx64 " <= 0x%08" PRIx32 "\n", fmt, addr_map.address, value); + + rtems_fdt_write (addr_map.address, value); return 0; } @@ -296,8 +365,10 @@ rtems_fdt_shell_wr (int argc, char *argv[]) static int rtems_fdt_shell_rd (int argc, char *argv[]) { - uint32_t address; - uint32_t offset = 0; + rtems_fdt_address_map addr_map; + uint32_t offset = 0; + int fmt; + int r; if ((argc < 1) || (argc > 3)) return rtems_fdt_wrong_number_of_args (); @@ -305,12 +376,25 @@ rtems_fdt_shell_rd (int argc, char *argv[]) if (argc == 3) offset = strtoul (argv[2], 0, 0); - if (!rtems_fdt_get_value32 (argv[1], "reg", sizeof (uint32_t), &address)) + r = rtems_fdt_getprop_address_map(&cmd_fdt_handle, argv[1], "reg", &addr_map); + if (r < 0) + { + printf("error: invalid reg address map: %d: %s\n", -r, argv[1]); + return 1; + } + + if (offset >= addr_map.size) + { + printf("error: offset out of range: %" PRIu64 ": %s\n", addr_map.size, argv[1]); return 1; + } + + addr_map.address += offset; - address += offset; + fmt = addr_map.address >= 0x0000000100000000ULL ? 16 : 8; - printf ("0x%08" PRIx32 " => 0x%08" PRIx32 "\n", address, rtems_fdt_read (address)); + printf ("0x%0*" PRIx64 " => 0x%08" PRIx32 "\n", + fmt, addr_map.address, rtems_fdt_read (addr_map.address)); return 0; } @@ -318,11 +402,13 @@ rtems_fdt_shell_rd (int argc, char *argv[]) static int rtems_fdt_shell_set (int argc, char *argv[]) { - uint32_t address; - uint32_t offset = 0; - uint32_t value; - int mask_arg; - uint32_t mask; + rtems_fdt_address_map addr_map; + uint32_t offset = 0; + uint32_t value; + int mask_arg; + uint32_t mask; + int fmt; + int r; if ((argc < 3) || (argc > 4)) return rtems_fdt_wrong_number_of_args (); @@ -335,24 +421,38 @@ rtems_fdt_shell_set (int argc, char *argv[]) mask_arg = 3; } - if (!rtems_fdt_get_value32 (argv[1], "reg", sizeof (uint32_t), &address)) + r = rtems_fdt_getprop_address_map(&cmd_fdt_handle, argv[1], "reg", &addr_map); + if (r < 0) + { + printf("error: invalid reg address map: %d: %s\n", -r, argv[1]); return 1; + } + + if (offset >= addr_map.size) + { + printf("error: offset out of range: %" PRIu64 ": %s\n", addr_map.size, argv[1]); + return 1; + } + + addr_map.address += offset; + + fmt = addr_map.address >= 0x0000000100000000ULL ? 16 : 8; if (isdigit ((unsigned char) argv[mask_arg][0])) mask = strtoul (argv[mask_arg], 0, 0); else { + mask = 0; if (!rtems_fdt_get_value32 (argv[mask_arg], "mask", sizeof (uint32_t), &mask)) return 1; } - address += offset; - value = rtems_fdt_read (address); + value = rtems_fdt_read (addr_map.address); - printf ("0x%08" PRIx32 " <= 0x%08" PRIx32 " = 0x%08" PRIx32 " | 0x%08" PRIx32 "\n", - address, value | mask, value, mask); + printf ("0x%0*" PRIx64 " <= 0x%08" PRIx32 " = 0x%08" PRIx32 " | 0x%08" PRIx32 "\n", + fmt, addr_map.address, value | mask, value, mask); - rtems_fdt_write (address, value | mask); + rtems_fdt_write (addr_map.address, value | mask); return 0; } @@ -360,11 +460,13 @@ rtems_fdt_shell_set (int argc, char *argv[]) static int rtems_fdt_shell_cl (int argc, char *argv[]) { - uint32_t address; - uint32_t offset = 0; - uint32_t value; - int mask_arg; - uint32_t mask; + rtems_fdt_address_map addr_map; + uint32_t offset = 0; + uint32_t value; + int mask_arg; + uint32_t mask; + int fmt; + int r; if ((argc < 3) || (argc > 4)) return rtems_fdt_wrong_number_of_args (); @@ -377,25 +479,39 @@ rtems_fdt_shell_cl (int argc, char *argv[]) mask_arg = 3; } - if (!rtems_fdt_get_value32 (argv[1], "reg", sizeof (uint32_t), &address)) + r = rtems_fdt_getprop_address_map(&cmd_fdt_handle, argv[1], "reg", &addr_map); + if (r < 0) + { + printf("error: invalid reg address map: %d: %s\n", -r, argv[1]); return 1; + } + + if (offset >= addr_map.size) + { + printf("error: offset out of range: %" PRIu64 ": %s\n", addr_map.size, argv[1]); + return 1; + } + + addr_map.address += offset; + + fmt = addr_map.address >= 0x0000000100000000ULL ? 16 : 8; if (isdigit ((unsigned char) argv[mask_arg][0])) mask = strtoul (argv[mask_arg], 0, 0); else { + mask = 0; if (!rtems_fdt_get_value32 (argv[mask_arg], "mask", sizeof (uint32_t), &mask)) return 1; } - address += offset; - value = rtems_fdt_read (address); + value = rtems_fdt_read (addr_map.address); - printf ("0x%08" PRIx32 " <= 0x%08" PRIx32 " = 0x%08" PRIx32 \ + printf ("0x%0*" PRIx64 " <= 0x%08" PRIx32 " = 0x%08" PRIx32 \ " & ~0x%08" PRIx32 " (0x%08" PRIx32 ")\n", - address, value & ~mask, value, mask, ~mask); + fmt, addr_map.address, value & ~mask, value, mask, ~mask); - rtems_fdt_write (address, value & ~mask); + rtems_fdt_write (addr_map.address, value & ~mask); return 0; } @@ -403,12 +519,14 @@ rtems_fdt_shell_cl (int argc, char *argv[]) static int rtems_fdt_shell_up (int argc, char *argv[]) { - uint32_t address; - uint32_t offset = 0; - uint32_t set; - uint32_t value; - int mask_arg; - uint32_t mask; + rtems_fdt_address_map addr_map; + uint32_t offset = 0; + uint32_t set; + uint32_t value; + int mask_arg; + uint32_t mask; + int fmt; + int r; if ((argc < 4) || (argc > 5)) return rtems_fdt_wrong_number_of_args (); @@ -423,25 +541,39 @@ rtems_fdt_shell_up (int argc, char *argv[]) set = strtoul (argv[mask_arg + 1], 0, 0); - if (!rtems_fdt_get_value32 (argv[1], "reg", sizeof (uint32_t), &address)) + r = rtems_fdt_getprop_address_map(&cmd_fdt_handle, argv[1], "reg", &addr_map); + if (r < 0) + { + printf("error: invalid reg address map: %d: %s\n", -r, argv[1]); return 1; + } + + if (offset >= addr_map.size) + { + printf("error: offset out of range: %" PRIu64 ": %s\n", addr_map.size, argv[1]); + return 1; + } + + addr_map.address += offset; + + fmt = addr_map.address >= 0x0000000100000000ULL ? 16 : 8; if (isdigit ((unsigned char) argv[mask_arg][0])) mask = strtoul (argv[mask_arg], 0, 0); else { + mask = 0; if (!rtems_fdt_get_value32 (argv[mask_arg], "mask", sizeof (uint32_t), &mask)) return 1; } - address += offset; - value = rtems_fdt_read (address); + value = rtems_fdt_read (addr_map.address); - printf ("0x%08" PRIx32 " <= 0x%08" PRIx32 " = (0x%08" PRIx32 \ + printf ("0x%0*" PRIx64 " <= 0x%08" PRIx32 " = (0x%08" PRIx32 \ " & ~0x%08" PRIx32 " (0x%08" PRIx32 ")) | 0x%08" PRIx32 "\n", - address, (value & ~mask) | set, value, mask, ~mask, set); + fmt, addr_map.address, (value & ~mask) | set, value, mask, ~mask, set); - rtems_fdt_write (address, (value & ~mask) | set); + rtems_fdt_write (addr_map.address, (value & ~mask) | set); return 0; } @@ -449,13 +581,15 @@ rtems_fdt_shell_up (int argc, char *argv[]) static int rtems_fdt_shell_tst (int argc, char *argv[]) { - uint32_t address; - uint32_t offset = 0; - uint32_t test; - uint32_t value = 0; - int mask_arg; - uint32_t mask; - time_t start; + rtems_fdt_address_map addr_map; + uint32_t offset = 0; + uint32_t test; + uint32_t value = 0; + int mask_arg; + uint32_t mask; + time_t start; + int fmt; + int r; if ((argc < 4) || (argc > 5)) return rtems_fdt_wrong_number_of_args (); @@ -470,37 +604,50 @@ rtems_fdt_shell_tst (int argc, char *argv[]) test = strtoul (argv[mask_arg + 1], 0, 0); - if (!rtems_fdt_get_value32 (argv[1], "reg", sizeof (uint32_t), &address)) + r = rtems_fdt_getprop_address_map(&cmd_fdt_handle, argv[1], "reg", &addr_map); + if (r < 0) + { + printf("error: invalid reg address map: %d: %s\n", -r, argv[1]); return 1; + } + + if (offset >= addr_map.size) + { + printf("error: offset out of range: %" PRIu64 ": %s\n", addr_map.size, argv[1]); + return 1; + } + + addr_map.address += offset; + + fmt = addr_map.address >= 0x0000000100000000ULL ? 16 : 8; if (isdigit ((unsigned char) argv[mask_arg][0])) mask = strtoul (argv[mask_arg], 0, 0); else { - if (!rtems_fdt_get_value32 (argv[mask_arg], "mask", sizeof (uint32_t), &mask)) + mask = 0; + if (!rtems_fdt_get_value32 (argv[mask_arg], "mask", sizeof (uint32_t), &mask)) return 1; } - address += offset; - start = time (NULL); - printf ("0x%08" PRIx32 " => (value & 0x%08" PRIx32 ") == 0x%08" PRIx32 \ + printf ("0x%0*" PRIx64 " => (value & 0x%08" PRIx32 ") == 0x%08" PRIx32 \ " for %ld seconds\n", - address, mask, test, rtems_fdt_test_timeout); + fmt, addr_map.address, mask, test, rtems_fdt_test_timeout); while ((time (NULL) - start) < rtems_fdt_test_timeout) { int i; for (i = 0; i < 10000; ++i) { - value = rtems_fdt_read (address); + value = rtems_fdt_read (addr_map.address); if ((value & mask) == test) return 0; } } - printf ("0x%08" PRIx32 " => 0x%08" PRIx32 ": timeout\n", address, value); + printf ("0x%0*" PRIx64 " => 0x%08" PRIx32 ": timeout\n", fmt, addr_map.address, value); return 1; } diff --git a/cpukit/libmisc/rtems-fdt/rtems-fdt.c b/cpukit/libmisc/rtems-fdt/rtems-fdt.c index 1cd2377967..9f8d7bfb24 100644 --- a/cpukit/libmisc/rtems-fdt/rtems-fdt.c +++ b/cpukit/libmisc/rtems-fdt/rtems-fdt.c @@ -1,14 +1,31 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /* * COPYRIGHT (c) 2013-2017 Chris Johns <chrisj@rtems.org> * - * 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. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ -#include <errno.h> #include <fcntl.h> -#include <stdlib.h> #include <stdio.h> #include <sys/stat.h> #include <sys/types.h> @@ -16,6 +33,7 @@ #include <libfdt.h> #include <zlib.h> +#include <rtems/malloc.h> #include <rtems/rtems-fdt.h> #include <rtems/thread.h> @@ -156,14 +174,14 @@ rtems_fdt_init_index (rtems_fdt_handle* fdt, rtems_fdt_blob* blob) /* * Create the index. */ - entries = calloc(num_entries, sizeof(rtems_fdt_index_entry)); + entries = rtems_calloc(num_entries, sizeof(rtems_fdt_index_entry)); if (!entries) { return -RTEMS_FDT_ERR_NO_MEMORY; } - names = calloc(1, total_name_memory); - if (!entries) + names = rtems_calloc(1, total_name_memory); + if (!names) { free(entries); return -RTEMS_FDT_ERR_NO_MEMORY; @@ -486,7 +504,7 @@ rtems_fdt_load (const char* filename, rtems_fdt_handle* handle) { size_t offset; - cdata = malloc(sb.st_size); + cdata = rtems_malloc(sb.st_size); if (!cdata) { close (bf); @@ -527,7 +545,7 @@ rtems_fdt_load (const char* filename, rtems_fdt_handle* handle) name_len = strlen (filename) + 1; - blob = malloc(sizeof (rtems_fdt_blob) + name_len + bsize); + blob = rtems_malloc(sizeof (rtems_fdt_blob) + name_len + bsize); if (!blob) { free(cdata); @@ -611,6 +629,7 @@ rtems_fdt_load (const char* filename, rtems_fdt_handle* handle) return fe; } + close (bf); return 0; } @@ -629,7 +648,7 @@ rtems_fdt_register (const void* dtb, rtems_fdt_handle* handle) return fe; } - blob = malloc(sizeof (rtems_fdt_blob)); + blob = rtems_malloc(sizeof (rtems_fdt_blob)); if (!blob) { return -RTEMS_FDT_ERR_NO_MEMORY; @@ -680,14 +699,14 @@ rtems_fdt_unload (rtems_fdt_handle* handle) rtems_chain_extract_unprotected (&handle->blob->node); + rtems_fdt_release_index(&handle->blob->index); + free (handle->blob); handle->blob = NULL; rtems_fdt_unlock (fdt); - rtems_fdt_release_index(&handle->blob->index); - return 0; } @@ -762,6 +781,27 @@ rtems_fdt_get_name (rtems_fdt_handle* handle, int nodeoffset, int* length) return name; } +int +rtems_fdt_first_prop_offset(rtems_fdt_handle* handle, int nodeoffset) +{ + return fdt_first_property_offset(handle->blob->blob, nodeoffset); +} + +int +rtems_fdt_next_prop_offset(rtems_fdt_handle* handle, int propoffset) +{ + return fdt_next_property_offset(handle->blob->blob, propoffset); +} + +const void* +rtems_fdt_getprop_by_offset(rtems_fdt_handle* handle, + int propoffset, + const char** name, + int* length) +{ + return fdt_getprop_by_offset(handle->blob->blob, propoffset, name, length); +} + const void* rtems_fdt_getprop_namelen (rtems_fdt_handle* handle, int nodeoffset, @@ -921,7 +961,8 @@ rtems_fdt_strerror (int errval) "no memory", "file not found", "DTB read fail", - "blob has references" + "blob has references", + "bad length" }; if (errval > -RTEMS_FDT_ERR_RTEMS_MIN) return fdt_strerror (errval); @@ -957,7 +998,7 @@ rtems_fdt_prop_value(const char* const path, if (length > (int) *size) { rtems_fdt_release_handle (&fdt); - return RTEMS_FDT_ERR_BADPATH; + return -RTEMS_FDT_ERR_BADPATH; } *size = length; @@ -967,11 +1008,29 @@ rtems_fdt_prop_value(const char* const path, return 0; } +bool +rtems_fdt_get_parent_prop_value(rtems_fdt_handle* handle, + int nodeoffset, + const char* name, + uint32_t* value) +{ + const void* prop; + int plen = 0; + int node = rtems_fdt_parent_offset(handle, nodeoffset); + if (node < 0) + return false; + prop = rtems_fdt_getprop(handle, node, name, &plen); + if (plen < 0) + return false; + *value = rtems_fdt_get_uint32(prop); + return true; +} + int rtems_fdt_prop_map(const char* const path, const char* const propname, const char* const names[], - uint32_t* values, + uintptr_t* values, size_t count) { rtems_fdt_handle fdt; @@ -986,10 +1045,9 @@ rtems_fdt_prop_map(const char* const path, for (item = 0; item < count; item++) { - const void* prop; - const uint8_t* p; - int length; - int subnode; + const void* prop; + int length; + int subnode; subnode = rtems_fdt_subnode_offset (&fdt, node, names[item]); if (subnode < 0) @@ -1005,40 +1063,85 @@ rtems_fdt_prop_map(const char* const path, return length; } - if (length != sizeof (uint32_t)) + if (length > sizeof (uintptr_t)) { rtems_fdt_release_handle (&fdt); - return RTEMS_FDT_ERR_BADPATH; + return -RTEMS_FDT_ERR_BADPATH; } - p = prop; - - values[item] = ((((uint32_t) p[0]) << 24) | - (((uint32_t) p[1]) << 16) | - (((uint32_t) p[2]) << 8) | - (uint32_t) p[3]); + values[item] = rtems_fdt_get_offset_len_uintptr(prop, 0, length); } return 0; } +uintptr_t +rtems_fdt_get_offset_len_uintptr (const void* prop, int offset, int len) +{ + const uint8_t* p = prop; + uintptr_t value = 0; + int b; + if (len <= sizeof(uintptr_t)) { + for (b = 0; b < len; ++b) { + value = (value << 8) | (uintptr_t) p[offset++]; + } + } + return value; +} + + uint32_t -rtems_fdt_get_uint32 (const void* prop) +rtems_fdt_get_offset_uint32 (const void* prop, int offset) { const uint8_t* p = prop; uint32_t value; - value = ((((uint32_t) p[0]) << 24) | - (((uint32_t) p[1]) << 16) | - (((uint32_t) p[2]) << 8) | - (uint32_t) p[3]); + offset *= sizeof(uint32_t); + value = ((((uint32_t) p[offset + 0]) << 24) | + (((uint32_t) p[offset + 1]) << 16) | + (((uint32_t) p[offset + 2]) << 8) | + (uint32_t) p[offset + 3]); return value; } +uint32_t +rtems_fdt_get_uint32 (const void* prop) +{ + return rtems_fdt_get_offset_uint32(prop, 0); +} + +uint64_t +rtems_fdt_get_offset_uint64 (const void* prop, int offset) +{ + uint64_t value = rtems_fdt_get_offset_uint32(prop, offset); + value = (value << 16) << 16; + return value | rtems_fdt_get_offset_uint32(prop, offset + 1); +} + +uint64_t +rtems_fdt_get_uint64 (const void* prop) +{ + return rtems_fdt_get_offset_uint64(prop, 0); +} + +uintptr_t +rtems_fdt_get_uintptr (const void* prop) +{ + return rtems_fdt_get_offset_uintptr(prop, 0); +} + +uintptr_t +rtems_fdt_get_offset_uintptr (const void* prop, int offset) +{ + if (sizeof(intptr_t) == sizeof(uint32_t)) + return rtems_fdt_get_offset_uint32(prop, offset); + return rtems_fdt_get_offset_uint64(prop, offset); +} + int rtems_fdt_get_value (const char* path, const char* property, size_t size, - uint32_t* value) + uintptr_t* value) { rtems_fdt_handle fdt; const void* prop; @@ -1061,8 +1164,8 @@ rtems_fdt_get_value (const char* path, return length; } - if (length == sizeof (uint32_t)) - *value = rtems_fdt_get_uint32 (prop); + if (length == sizeof (uintptr_t)) + *value = rtems_fdt_get_uintptr (prop); else *value = 0; @@ -1099,3 +1202,111 @@ rtems_fdt_entry_offset(rtems_fdt_handle* handle, int id) { return handle->blob->index.entries[id].offset; } + +int +rtems_fdt_getprop_address_cells(rtems_fdt_handle* handle, int nodeoffset) +{ + uint32_t value = 0; + if (!rtems_fdt_get_parent_prop_value(handle, nodeoffset, "#address-cells", &value)) + return -1; + return value; +} + +int +rtems_fdt_getprop_size_cells(rtems_fdt_handle* handle, int nodeoffset) +{ + uint32_t value = 0; + if (!rtems_fdt_get_parent_prop_value(handle, nodeoffset, "#size-cells", &value)) + return -1; + return value; +} + +int rtems_fdt_getprop_address_map(rtems_fdt_handle* handle, + const char* path, + const char* name, + rtems_fdt_address_map* addr_map) +{ + const void* prop; + int plen = 0; + int poff = 0; + int len; + + memset(addr_map, 0, sizeof(*addr_map)); + + addr_map->node = rtems_fdt_path_offset(handle, path); + if (addr_map->node < 0) + return -RTEMS_FDT_ERR_NOTFOUND; + + addr_map->address_cells = rtems_fdt_getprop_address_cells(handle, addr_map->node); + addr_map->size_cells = rtems_fdt_getprop_size_cells(handle, addr_map->node); + + prop = rtems_fdt_getprop(handle, addr_map->node, name, &plen); + if (plen < 0) + return -RTEMS_FDT_ERR_NOTFOUND; + + if (addr_map->address_cells == 0) + return -RTEMS_FDT_ERR_BADOFFSET; + + if (addr_map->address_cells < 0) + { + if (addr_map->size_cells > 0) + return -RTEMS_FDT_ERR_BADOFFSET; + addr_map->address_cells = 1; + } + + if (addr_map->size_cells < 0) + { + addr_map->size = sizeof(uint32_t); + addr_map->size_cells = 0; + } + + len = (addr_map->address_cells + addr_map->size_cells) * sizeof(uint32_t); + + if (len != plen) + return -RTEMS_FDT_ERR_BADLENGTH; + + switch (addr_map->address_cells) + { + case 1: + if (plen < sizeof(uint32_t)) + return -RTEMS_FDT_ERR_BADLENGTH; + addr_map->address = rtems_fdt_get_offset_uint32(prop, poff); + poff += 1; + plen -= sizeof(uint32_t); + break; + case 2: + if (plen < sizeof(uint64_t)) + return -RTEMS_FDT_ERR_BADLENGTH; + addr_map->address = rtems_fdt_get_offset_uint64(prop, poff); + poff += 2; + plen -= sizeof(uint64_t); + break; + default: + return -RTEMS_FDT_ERR_BADLENGTH; + } + + switch (addr_map->size_cells) + { + case 0: + addr_map->size = sizeof(uint32_t); + break; + case 1: + if (plen < sizeof(uint32_t)) + return -RTEMS_FDT_ERR_BADLENGTH; + addr_map->size = rtems_fdt_get_offset_uint32(prop, poff); + poff += 1; + plen -= sizeof(uint32_t); + break; + case 2: + if (plen < sizeof(uint64_t)) + return -RTEMS_FDT_ERR_BADLENGTH; + addr_map->size = rtems_fdt_get_offset_uint64(prop, poff); + poff += 2; + plen -= sizeof(uint64_t); + break; + default: + return -RTEMS_FDT_ERR_BADLENGTH; + } + + return 0; +} diff --git a/cpukit/libmisc/serdbg/README b/cpukit/libmisc/serdbg/README deleted file mode 100644 index 64623ebd89..0000000000 --- a/cpukit/libmisc/serdbg/README +++ /dev/null @@ -1,134 +0,0 @@ -This directory contains three useful packages related to the termios I/O -system: - -PACKAGE SERDBGIO -================ -"serdbgio" provides the "serial gdb" standard I/O functions "getDebugChar" -and "putDebugChar" for any device driver supporting polled termios mode. - -The initialization function "serdbg_open" opens the v.24 port intended -for the serial debug connection, and sets the desired baud rate. The -"getDebugChar" and "putDebugChar" functions then interact with the -corresponding driver using the calls intended for polled termios -operation. - -Specification for the debug device, baud rate and other parameters is -done in a global structure of type "serdbg_conf_t". A configuration -mechanism quite similar to the overall RTEMS configuration is available. - -PACKAGE SERDBG -============== -"serdbg" provides a means to optionally initialize and/or start a -serial gdb session as soon as possible, this means as soon as all -drivers have been initialized. The serial debug I/O functions can -either be integrated as special routines of the BSP drivers, or using -the package "serdbgio" - -PACKAGE TERMIOS_PRINTK -====================== -"termios_printk" provides a standard output function suitable to use -with "printk". It uses the same technique as serdbgio, hooking the -interface between a polled device driver and the termios system. - - -REQUIREMENTS -============ - -- These two packages can be used with any polled termios device -driver. -- For standard initialization, they need a modified "bsppost.c" -to perform the initialization calls. - -USAGE -===== - -For using these packages add the following to your "init" module or -your "system.h" file (Note: most macro settings fall back to a -default, if not set.): - -/* - * CONFIGURE_USE_SERDBG - * set this macro, if you want to connect gdb over a serial line - * when set, the debug stub will be connected after driver - * initialization in "bsppost.c" - */ -#define CONFIGURE_USE_SERDBG - - -/* - * CONFIGURE_SERDBG_SKIP_INIT_BKPT - * set this macro, if you do not want the gdb interface to wait for a - * debugger connection directly after initialization - * If you set this macro, the gdb stub will only hook various - * exception vectors when called from "bsppost.c". - */ -/* #define CONFIGURE_SERDBG_SKIP_INIT_BKPT */ - -/* - * CONFIGURE_SERDBG_USE_POLLED_TERMIOS - * set this macro, if you want "serdbgio" to provide the I/O - * functions for the serial gdb connection - */ -#define CONFIGURE_SERDBG_USE_POLLED_TERMIOS - -/* - * CONFIGURE_SERDBG_DEVNAME - * use this macro to specify the serial device to use - * for "serdbgio". - * Only used, when CONFIGURE_SERDBG_USE_POLLED_TERMIOS is set - */ -#define CONFIGURE_SERDBG_DEVNAME "/dev/tty03" - -/* - * CONFIGURE_SERDBG_BAUDRATE - * use this macro to specify the baud rate to use - * for "serdbgio". - * Only used, when CONFIGURE_SERDBG_USE_POLLED_TERMIOS is set - */ -#define CONFIGURE_SERDBG_BAUDRATE 57600 - -/* - * CONFIGURE_SERDBG_CALLOUT - * use this macro to specify a routine that will called during I/O polling - * Only used, when CONFIGURE_SERDBG_USE_POLLED_TERMIOS is set - * This function of type "void pollfnc(void)" can be used for e.g. - * tickling a watchdog - */ -/* #define CONFIGURE_SERDBG_CALLOUT tickle_my_watchdog_fnc */ - -#include <serdbgcnf.h> - -/* - * CONFIGURE_USE_TERMIOS_PRINTK - * set this macro, if you want printk output to be sent to a serial - * driver using the polled termios interface - * when set, the printk output function will be connected after driver - * initialization in "bsppost.c" - */ -#define CONFIGURE_USE_TERMIOS_PRINTK - -/* - * CONFIGURE_TERMIOS_PRINTK_DEVNAME - * use this macro to specify the serial device to use - * for printk output. - * Only used, when CONFIGURE_USE_TERMIOS_PRINTK is set - */ -#define CONFIGURE_TERMIOS_PRINTK_DEVNAME "/dev/console" - -/* - * CONFIGURE_TERMIOS_PRINTK_BAUDRATE - * use this macro to specify the baudrate to use - * for printk output. - * Only used, when CONFIGURE_USE_TERMIOS_PRINTK is set - */ -#define CONFIGURE_TERMIOS_PRINTK_BAUDRATE 9600 - -/* - * CONFIGURE_TERMIOS_PRINTK_CALLOUT - * use this macro to specify a routine that will called during I/O polling - * This function of type "void pollfnc(void)" can be used for e.g. - * tickling a watchdog - */ -/* #define CONFIGURE_TERMIOS_PRINTK_CALLOUT tickle_my_watchdog_fnc */ - -#include <termios_printk_cnf.h> diff --git a/cpukit/libmisc/serdbg/serdbg.c b/cpukit/libmisc/serdbg/serdbg.c deleted file mode 100644 index 5460567fd5..0000000000 --- a/cpukit/libmisc/serdbg/serdbg.c +++ /dev/null @@ -1,89 +0,0 @@ -/*===============================================================*\ -| Project: RTEMS remote gdb over serial line | -+-----------------------------------------------------------------+ -| File: serdbg.c | -+-----------------------------------------------------------------+ -| Copyright (c) 2002 IMD | -| Ingenieurbuero fuer Microcomputertechnik Th. Doerfler | -| <Thomas.Doerfler@imd-systems.de> | -| all rights reserved | -+-----------------------------------------------------------------+ -| this file contains intialization and utility functions to add | -| a gdb remote debug stub to an RTEMS system | -| | -+-----------------------------------------------------------------+ -| date history ID | -| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | -| 04.04.02 creation doe | -\*===============================================================*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <rtems.h> -#include <stdio.h> -#include <string.h> -#include <fcntl.h> -#include <errno.h> -#include <rtems/serdbg.h> - - -/*=========================================================================*\ -| Function: | -\*-------------------------------------------------------------------------*/ -int serdbg_init_dbg -( -/*-------------------------------------------------------------------------*\ -| Purpose: | -| initialize remote gdb session over serial line | -+---------------------------------------------------------------------------+ -| Input Parameters: | -\*-------------------------------------------------------------------------*/ - void -) -/*-------------------------------------------------------------------------*\ -| Return Value: | -| rtems_status_code | -\*=========================================================================*/ -{ - static bool is_initialized = false; - - rtems_status_code rc = RTEMS_SUCCESSFUL; - - if (is_initialized) { - return RTEMS_SUCCESSFUL; - } - is_initialized = true; - /* - * try to open serial device - */ - if (rc == RTEMS_SUCCESSFUL) { - if ((serdbg_conf.open_io != NULL) && - (0 > serdbg_conf.open_io(serdbg_conf.devname,serdbg_conf.baudrate))) { - fprintf(stderr, - "remote_gdb_init: cannot open device %s " - "for gdb connection:%s\n",serdbg_conf.devname,strerror(errno)); - rc = RTEMS_IO_ERROR; - } - } - /* - * initialize gdb stub - */ - if (rc == RTEMS_SUCCESSFUL) { - set_debug_traps(); - } - /* - * now activate gdb stub - */ - if ((rc == RTEMS_SUCCESSFUL) && - !serdbg_conf.skip_init_bkpt) { - breakpoint(); - } - - /* - * return to original function - * this may be already unter gdb control - */ - return rc; -} diff --git a/cpukit/libmisc/serdbg/serdbgio.c b/cpukit/libmisc/serdbg/serdbgio.c deleted file mode 100644 index 5de2005472..0000000000 --- a/cpukit/libmisc/serdbg/serdbgio.c +++ /dev/null @@ -1,253 +0,0 @@ -/*===============================================================*\ -| File: serdbgio.c | -+-----------------------------------------------------------------+ -| Copyright (c) 2002 IMD | -| Ingenieurbuero fuer Microcomputertechnik Th. Doerfler | -| Hebststr. 8, 82178 Puchheim, Germany | -| <Thomas.Doerfler@imd-systems.de> | -| 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. | -| all rights reserved | -+-----------------------------------------------------------------+ -| TERMIOS serial gdb interface support | -| the functions in this file allow the standard gdb stubs like | -| "m68k-stub.c" to access any serial interfaces that work with | -| RTEMS termios in polled mode | -| | -+-----------------------------------------------------------------+ -| date history ID | -| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | -| 10.05.02 creation doe | -|*****************************************************************| -\*===============================================================*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <rtems.h> -#include <rtems/libio_.h> -#include <errno.h> -#include <unistd.h> /* close */ -#include <stdio.h> -#include <fcntl.h> -#include <termios.h> - -#include <rtems/termiostypes.h> -#include <rtems/serdbg.h> - - -/* - * internal variables - */ -int serdbg_fd = -1; -struct rtems_termios_tty *serdbg_tty; - -/*=========================================================================*\ -| Function: | -\*-------------------------------------------------------------------------*/ -int serdbg_open - -/*-------------------------------------------------------------------------*\ -| Purpose: | -| try to open given serial debug port | -+---------------------------------------------------------------------------+ -| Input Parameters: | -\*-------------------------------------------------------------------------*/ -( - const char *dev_name, /* name of device to open */ - uint32_t baudrate /* baud rate to use */ -) -/*-------------------------------------------------------------------------*\ -| Return Value: | -| 0 on success, -1 and errno otherwise | -\*=========================================================================*/ -{ - bool err_occurred = false; - rtems_libio_t *iop = NULL; - struct termios act_termios; - tcflag_t baudcode = B0; - -#define FD_STORE_CNT 3 - int fd_store[FD_STORE_CNT]; - int fd_store_used = 0; - - /* - * translate baudrate into baud code - */ - switch(baudrate) { - case 50: baudcode = B50; break; - case 75: baudcode = B75; break; - case 110: baudcode = B110; break; - case 134: baudcode = B134; break; - case 150: baudcode = B150; break; - case 200: baudcode = B200; break; - case 300: baudcode = B300; break; - case 600: baudcode = B600; break; - case 1200: baudcode = B1200; break; - case 1800: baudcode = B1800; break; - case 2400: baudcode = B2400; break; - case 4800: baudcode = B4800; break; - case 9600: baudcode = B9600; break; - case 19200: baudcode = B19200; break; - case 38400: baudcode = B38400; break; - case 57600: baudcode = B57600; break; - case 115200: baudcode = B115200; break; - case 230400: baudcode = B230400; break; - case 460800: baudcode = B460800; break; - default : err_occurred = true; errno = EINVAL; break; - } - - /* - * open device for serdbg operation - * skip any fds that are between 0..2, because they are - * reserved for stdin/out/err - */ - if (!err_occurred && - (dev_name != NULL) && - (dev_name[0] != '\0')) { - do { - serdbg_fd = open(dev_name,O_RDWR); - if (serdbg_fd < 0) { - err_occurred = true; - } - else { - if (serdbg_fd < 3) { - if (fd_store_used >= FD_STORE_CNT) { - err_occurred = true; - } - else { - fd_store[fd_store_used++] = serdbg_fd; - } - } - } - } while (!err_occurred && - (serdbg_fd < 3)); - } - /* - * close any fds, that have been placed in fd_store - * so fd 0..2 are reusable again - */ - while (--fd_store_used >= 0) { - close(fd_store[fd_store_used]); - } - - /* - * capture tty structure - */ - if (!err_occurred) { - iop = rtems_libio_iop(serdbg_fd); - serdbg_tty = iop->data1; - } - /* - * set device baudrate - * (and transp mode, this is not really needed) - * ... - */ - /* - * ... get fd settings - */ - if (!err_occurred && - (0 != tcgetattr(serdbg_fd,&act_termios))) { - err_occurred = true; - } - if (!err_occurred) { - act_termios.c_iflag - &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP - |INLCR|IGNCR|ICRNL|IXON); - act_termios.c_oflag - &= ~OPOST; - - act_termios.c_lflag - &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); - - cfsetospeed(&act_termios,baudcode); - cfsetispeed(&act_termios,baudcode); - - if (0 != tcsetattr(serdbg_fd,TCSANOW,&act_termios)) { - err_occurred = true; - } - } - return (err_occurred - ? -1 - : 0); -} - -void putDebugChar(char c) __attribute__ ((__weak__)); -/*=========================================================================*\ -| Function: | -\*-------------------------------------------------------------------------*/ -void putDebugChar -/*-------------------------------------------------------------------------*\ -| Purpose: | -| send one character to serial port | -+---------------------------------------------------------------------------+ -| Input Parameters: | -\*-------------------------------------------------------------------------*/ -( - char c /* character to print */ -) -/*-------------------------------------------------------------------------*\ -| Return Value: | -| <none> | -\*=========================================================================*/ -{ - /* - * call serdbg polling callout, if available - */ - if (serdbg_conf.callout != NULL) { - serdbg_conf.callout(); - } - /* - * check, whether debug serial port is available - */ - if ((serdbg_tty != NULL) && - (serdbg_tty->device.write != NULL)) { - /* - * send character to debug serial port - */ - serdbg_tty->device.write(serdbg_tty->minor,&c,1); - } -} - -int getDebugChar(void) __attribute__ ((__weak__)); -/*=========================================================================*\ -| Function: | -\*-------------------------------------------------------------------------*/ -int getDebugChar -/*-------------------------------------------------------------------------*\ -| Purpose: | -| wait for one character from serial port | -+---------------------------------------------------------------------------+ -| Input Parameters: | -\*-------------------------------------------------------------------------*/ -( - void /* none */ -) -/*-------------------------------------------------------------------------*\ -| Return Value: | -| received character | -\*=========================================================================*/ -{ - int c = -1; - /* - * check, whether debug serial port is available - */ - if ((serdbg_tty != NULL) && - (serdbg_tty->device.pollRead != NULL)) { - do { - /* - * call serdbg polling callout, if available - */ - if (serdbg_conf.callout != NULL) { - serdbg_conf.callout(); - } - /* - * get character from debug serial port - */ - c = serdbg_tty->device.pollRead(serdbg_tty->minor); - } while (c < 0); - } - return c; -} diff --git a/cpukit/libmisc/serdbg/termios_printk.c b/cpukit/libmisc/serdbg/termios_printk.c deleted file mode 100644 index 3da216f6e9..0000000000 --- a/cpukit/libmisc/serdbg/termios_printk.c +++ /dev/null @@ -1,234 +0,0 @@ -/*===============================================================*\ -| File: termios_printk.c | -+-----------------------------------------------------------------+ -| Copyright (c) 2002 IMD | -| Ingenieurbuero fuer Microcomputertechnik Th. Doerfler | -| Hebststr. 8, 82178 Puchheim, Germany | -| <Thomas.Doerfler@imd-systems.de> | -| 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. | -| all rights reserved | -+-----------------------------------------------------------------+ -| TERMIOS printk support | -| this module performs low-level printk output using | -| a polled termios driver | -| | -+-----------------------------------------------------------------+ -| date history ID | -| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | -| 13.05.02 creation doe | -|*****************************************************************| -\*===============================================================*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <rtems.h> -#include <rtems/libio_.h> -#include <errno.h> -#include <stdio.h> -#include <fcntl.h> -#include <termios.h> - -#include <rtems/termiostypes.h> -#include <rtems/bspIo.h> -#include <rtems/termios_printk.h> - -/* - * internal variables - */ -int termios_printk_fd = -1; -struct rtems_termios_tty *termios_printk_tty; - -static void _termios_printk_null_char( - char c RTEMS_UNUSED) -{ - return; -} - -BSP_output_char_function_type BSP_output_char = _termios_printk_null_char; -BSP_polling_getchar_function_type BSP_poll_char; - -/*=========================================================================*\ -| Function: | -\*-------------------------------------------------------------------------*/ -void termios_printk_outputchar -/*-------------------------------------------------------------------------*\ -| Purpose: | -| send one character to serial port | -+---------------------------------------------------------------------------+ -| Input Parameters: | -\*-------------------------------------------------------------------------*/ -( - char c /* character to print */ -) -/*-------------------------------------------------------------------------*\ -| Return Value: | -| <none> | -\*=========================================================================*/ -{ - /* - * check, whether printk serial port is available - */ - - if ((termios_printk_tty != NULL) && - (termios_printk_tty->device.write != NULL)) { - /* - * call termios_printk polling callout, if available - */ - if (termios_printk_conf.callout != NULL) { - termios_printk_conf.callout(); - } - /* - * send character to debug serial port - */ - termios_printk_tty->device.write(termios_printk_tty->minor,&c,1); - } -} - -/*=========================================================================*\ -| Function: | -\*-------------------------------------------------------------------------*/ -int termios_printk_inputchar -/*-------------------------------------------------------------------------*\ -| Purpose: | -| wait for one character from serial port | -+---------------------------------------------------------------------------+ -| Input Parameters: | -\*-------------------------------------------------------------------------*/ -( - void /* none */ -) -/*-------------------------------------------------------------------------*\ -| Return Value: | -| received character | -\*=========================================================================*/ -{ - int c = -1; - /* - * check, whether debug serial port is available - */ - if ((termios_printk_tty != NULL) && - (termios_printk_tty->device.pollRead != NULL)) { - do { - /* - * call termios_printk polling callout, if available - */ - if (termios_printk_conf.callout != NULL) { - termios_printk_conf.callout(); - } - /* - * get character from debug serial port - */ - c = termios_printk_tty->device.pollRead(termios_printk_tty->minor); - } while (c < 0); - } - return c; -} - - -/*=========================================================================*\ -| Function: | -\*-------------------------------------------------------------------------*/ -int termios_printk_open - -/*-------------------------------------------------------------------------*\ -| Purpose: | -| try to open given serial debug port | -+---------------------------------------------------------------------------+ -| Input Parameters: | -\*-------------------------------------------------------------------------*/ -( - const char *dev_name, /* name of device to open */ - uint32_t baudrate /* baud rate to use */ -) -/*-------------------------------------------------------------------------*\ -| Return Value: | -| 0 on success, -1 and errno otherwise | -\*=========================================================================*/ -{ - bool err_occurred = false; - rtems_libio_t *iop = NULL; - struct termios act_termios; - tcflag_t baudcode = B0; - - if (termios_printk_fd >= 0) { - /* - * already initialized - */ - return 0; - } - /* - * translate baudrate into baud code - */ - switch(baudrate) { - case 50: baudcode = B50; break; - case 75: baudcode = B75; break; - case 110: baudcode = B110; break; - case 134: baudcode = B134; break; - case 150: baudcode = B150; break; - case 200: baudcode = B200; break; - case 300: baudcode = B300; break; - case 600: baudcode = B600; break; - case 1200: baudcode = B1200; break; - case 1800: baudcode = B1800; break; - case 2400: baudcode = B2400; break; - case 4800: baudcode = B4800; break; - case 9600: baudcode = B9600; break; - case 19200: baudcode = B19200; break; - case 38400: baudcode = B38400; break; - case 57600: baudcode = B57600; break; - case 115200: baudcode = B115200; break; - case 230400: baudcode = B230400; break; - case 460800: baudcode = B460800; break; - default : err_occurred = true; errno = EINVAL; break; - } - /* - * open device for serdbg operation - */ - if (!err_occurred && - (dev_name != NULL) && - (dev_name[0] != '\0')) { - termios_printk_fd = open(dev_name,O_RDWR); - if (termios_printk_fd < 0) { - err_occurred = true; - } - } - /* - * capture tty structure - */ - if (!err_occurred) { - iop = rtems_libio_iop(termios_printk_fd); - termios_printk_tty = iop->data1; - } - /* - * set device baudrate - * (and transp mode, this is not really needed) - * ... - */ - /* - * ... get fd settings - */ - if (!err_occurred && - (0 != tcgetattr(termios_printk_fd,&act_termios))) { - err_occurred = true; - } - if (!err_occurred) { - - cfsetospeed(&act_termios,baudcode); - cfsetispeed(&act_termios,baudcode); - - if (0 != tcsetattr(termios_printk_fd,TCSANOW,&act_termios)) { - err_occurred = true; - } - } - if (!err_occurred) { - BSP_output_char = termios_printk_outputchar; - BSP_poll_char = termios_printk_inputchar; - } - return (err_occurred - ? -1 - : 0); -} diff --git a/cpukit/libmisc/shell/cat_file.c b/cpukit/libmisc/shell/cat_file.c index f7a530c56c..50aaa8e3f4 100644 --- a/cpukit/libmisc/shell/cat_file.c +++ b/cpukit/libmisc/shell/cat_file.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief CAT Command Implementation + */ + /* - * CAT Command Implementation - * - * Author: - * WORK: fernando.ruiz@ctv.es - * HOME: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/cmds.c b/cpukit/libmisc/shell/cmds.c index dbc63639eb..608961de4c 100644 --- a/cpukit/libmisc/shell/cmds.c +++ b/cpukit/libmisc/shell/cmds.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief XXX -- Just monitor commands until those can be integrated better + */ + /* - * XXX -- Just monitor commands until those can be integrated better - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/fdisk.c b/cpukit/libmisc/shell/fdisk.c index c244922492..78b017c3c7 100644 --- a/cpukit/libmisc/shell/fdisk.c +++ b/cpukit/libmisc/shell/fdisk.c @@ -6,11 +6,6 @@ /* * Copyright (c) 2009, 2020 - * embedded brains GmbH - * Dornierstr. 4 - * 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 diff --git a/cpukit/libmisc/shell/hexdump-conv.c b/cpukit/libmisc/shell/hexdump-conv.c index aa16f9b169..24b28353f3 100644 --- a/cpukit/libmisc/shell/hexdump-conv.c +++ b/cpukit/libmisc/shell/hexdump-conv.c @@ -117,7 +117,11 @@ retry: if (clen == 0) clen = 1; else if (clen == (size_t)-1 || (clen == (size_t)-2 && +#ifndef __rtems__ buf == peekbuf)) { +#else /* __rtems__ */ + &buf[0] == &peekbuf[0])) { +#endif /* __rtems__ */ memset(&pr->mbstate, 0, sizeof(pr->mbstate)); wc = *p; clen = 1; diff --git a/cpukit/libmisc/shell/login_check.c b/cpukit/libmisc/shell/login_check.c index a1af07ce1d..d9bce28a7d 100644 --- a/cpukit/libmisc/shell/login_check.c +++ b/cpukit/libmisc/shell/login_check.c @@ -5,13 +5,7 @@ */ /* - * Copyright (c) 2009-2014 embedded brains GmbH and others. - * - * embedded brains GmbH - * Dornierstr. 4 - * D-82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Copyright (C) 2009, 2014 embedded brains GmbH & Co. KG * * Based on work from Chris Johns and Fernando Ruiz. * diff --git a/cpukit/libmisc/shell/login_prompt.c b/cpukit/libmisc/shell/login_prompt.c index 3533a65a87..149966be63 100644 --- a/cpukit/libmisc/shell/login_prompt.c +++ b/cpukit/libmisc/shell/login_prompt.c @@ -48,13 +48,7 @@ * * ------------------ SLAC Software Notices, Set 4 OTT.002a, 2004 FEB 03 * - * Copyright (c) 2009 embedded brains GmbH and others. - * - * embedded brains GmbH - * Obere Lagerstr. 30 - * D-82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Copyright (c) 2009 embedded brains GmbH & Co. KG * * Based on work from Chris Johns, Fernando Ruiz and Till Straumann. * diff --git a/cpukit/libmisc/shell/main_alias.c b/cpukit/libmisc/shell/main_alias.c index 63a808c066..163a8475aa 100644 --- a/cpukit/libmisc/shell/main_alias.c +++ b/cpukit/libmisc/shell/main_alias.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief ALIAS Shell Command Implmentation + */ + /* - * ALIAS Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_blkstats.c b/cpukit/libmisc/shell/main_blkstats.c index 7093d47f9b..3acc652d87 100644 --- a/cpukit/libmisc/shell/main_blkstats.c +++ b/cpukit/libmisc/shell/main_blkstats.c @@ -1,11 +1,5 @@ /* - * Copyright (c) 2012 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Obere Lagerstr. 30 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Copyright (c) 2012 embedded brains GmbH & Co. KG * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_blksync.c b/cpukit/libmisc/shell/main_blksync.c index 9b1cd24fbc..bc429e08f2 100644 --- a/cpukit/libmisc/shell/main_blksync.c +++ b/cpukit/libmisc/shell/main_blksync.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief RM Shell Command Implmentation + */ + /* - * RM Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_cat.c b/cpukit/libmisc/shell/main_cat.c index 145db6b928..539f4493e6 100644 --- a/cpukit/libmisc/shell/main_cat.c +++ b/cpukit/libmisc/shell/main_cat.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief CAT Shell Command Implmentation + */ + /* - * CAT Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_cd.c b/cpukit/libmisc/shell/main_cd.c index 7b138742d3..dca1618d70 100644 --- a/cpukit/libmisc/shell/main_cd.c +++ b/cpukit/libmisc/shell/main_cd.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief CD Shell Command Implmentation + */ + /* - * CD Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_chdir.c b/cpukit/libmisc/shell/main_chdir.c index 08d1c6e1ef..69f439d6f8 100644 --- a/cpukit/libmisc/shell/main_chdir.c +++ b/cpukit/libmisc/shell/main_chdir.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief CHDIR Shell Command Implmentation + */ + /* - * CHDIR Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_chmod.c b/cpukit/libmisc/shell/main_chmod.c index 8b932fac15..9a42cbd940 100644 --- a/cpukit/libmisc/shell/main_chmod.c +++ b/cpukit/libmisc/shell/main_chmod.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief CHMOD Shell Command Implmentation + */ + /* - * CHMOD Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at @@ -54,7 +56,7 @@ static int rtems_shell_main_chmod( * Now change the files modes */ for (n=2 ; n < argc ; n++) { - sc = chmod(argv[n++], mode); + sc = chmod(argv[n], mode); _Assert_Unused_variable_unequal(sc, -1); } diff --git a/cpukit/libmisc/shell/main_chroot.c b/cpukit/libmisc/shell/main_chroot.c index 415a47c912..247cd2a22f 100644 --- a/cpukit/libmisc/shell/main_chroot.c +++ b/cpukit/libmisc/shell/main_chroot.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief CHROOT Shell Command Implmentation + */ + /* - * CHROOT Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_cmdchmod.c b/cpukit/libmisc/shell/main_cmdchmod.c index 26772343e3..b6ec03bd5d 100644 --- a/cpukit/libmisc/shell/main_cmdchmod.c +++ b/cpukit/libmisc/shell/main_cmdchmod.c @@ -1,11 +1,5 @@ /* - * Copyright (c) 2014 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Copyright (c) 2014 embedded brains GmbH & Co. KG * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_cmdchown.c b/cpukit/libmisc/shell/main_cmdchown.c index a5496eb38a..ba44d70ebb 100644 --- a/cpukit/libmisc/shell/main_cmdchown.c +++ b/cpukit/libmisc/shell/main_cmdchown.c @@ -1,11 +1,5 @@ /* - * Copyright (c) 2014 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Copyright (c) 2014 embedded brains GmbH & Co. KG * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_cmdls.c b/cpukit/libmisc/shell/main_cmdls.c index 55f97a315c..529e070e8b 100644 --- a/cpukit/libmisc/shell/main_cmdls.c +++ b/cpukit/libmisc/shell/main_cmdls.c @@ -1,11 +1,5 @@ /* - * Copyright (c) 2014 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Copyright (c) 2014 embedded brains GmbH & Co. KG * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_cpuinfo.c b/cpukit/libmisc/shell/main_cpuinfo.c index 1a336fbb57..70179dcee8 100644 --- a/cpukit/libmisc/shell/main_cpuinfo.c +++ b/cpukit/libmisc/shell/main_cpuinfo.c @@ -1,11 +1,5 @@ /* - * Copyright (c) 2016 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Copyright (c) 2016 embedded brains GmbH & Co. KG * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_date.c b/cpukit/libmisc/shell/main_date.c index f93e5df016..5cae378b3c 100644 --- a/cpukit/libmisc/shell/main_date.c +++ b/cpukit/libmisc/shell/main_date.c @@ -1,11 +1,12 @@ +/** + * @file + * + * @brief DATE Shell Command Implmentation + */ + /* - * DATE Shell Command Implmentation - * - * OAuthor: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com - * - * Significantly rewritten by Joel Sherrill <joel.sherrill@oarcorp.com>. + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> + * Copyright (c) 2008 Joel Sherrill <joel.sherrill@oarcorp.com>. * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_dir.c b/cpukit/libmisc/shell/main_dir.c index 7d8e8bcb6b..6357a99243 100644 --- a/cpukit/libmisc/shell/main_dir.c +++ b/cpukit/libmisc/shell/main_dir.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief DIR Shell Command Implmentation + */ + /* - * DIR Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_drvmgr.c b/cpukit/libmisc/shell/main_drvmgr.c index bdf8d1c9ae..6090dde6b1 100644 --- a/cpukit/libmisc/shell/main_drvmgr.c +++ b/cpukit/libmisc/shell/main_drvmgr.c @@ -1,12 +1,31 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /* * DRVMGR Command Implementation * * COPYRIGHT (c) 2010. * Cobham Gaisler AB. * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.com/license/LICENSE. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/shell/main_edit.c b/cpukit/libmisc/shell/main_edit.c index ed1371f7fa..8317452b7b 100644 --- a/cpukit/libmisc/shell/main_edit.c +++ b/cpukit/libmisc/shell/main_edit.c @@ -55,7 +55,9 @@ #if defined(__linux__) || defined(__rtems__) #include <sys/ioctl.h> #include <termios.h> +#ifndef O_BINARY #define O_BINARY 0 +#endif static int linux_console; #endif @@ -410,6 +412,9 @@ static void move_gap(struct editor *ed, int pos, int minsize) { if (gapsize + MINEXTEND > minsize) minsize = gapsize + MINEXTEND; newsize = (ed->end - ed->start) - gapsize + minsize; start = (unsigned char *) malloc(newsize); // TODO check for out of memory + if (start == NULL) { + return; + } gap = start + pos; rest = gap + minsize; end = start + newsize; @@ -753,8 +758,23 @@ static void get_console_size(struct env *env) { env->cols = ws.ws_col; env->lines = ws.ws_row - 1; #elif defined(__rtems__) - env->cols = 80; + char* e; env->lines = 25; + env->cols = 80; + e = getenv("LINES"); + if (e != NULL) { + int lines = strtol(e, 0, 10); + if (lines > 0) { + env->lines = lines - 1; + } + } + e = getenv("COLUMNS"); + if (e != NULL) { + int cols = strtol(e, 0, 10); + if (cols > 0) { + env->cols = cols; + } + } #else struct term *term = gettib()->proc->term; env->cols = term->cols; @@ -1693,7 +1713,6 @@ static void copy_selection(struct editor *ed) { ed->env->clipboard = (unsigned char *) realloc(ed->env->clipboard, ed->env->clipsize); if (!ed->env->clipboard) return; copy(ed, ed->env->clipboard, selstart, ed->env->clipsize); - select_toggle(ed); } static void cut_selection(struct editor *ed) { @@ -1792,14 +1811,14 @@ static void save_editor(struct editor *ed) { ed->refresh = 1; } -static void close_editor(struct editor *ed) { +static struct editor* close_editor(struct editor *ed) { struct env *env = ed->env; if (ed->dirty) { display_message(ed, "Close %s without saving changes (y/n)? ", ed->filename); if (!ask()) { ed->refresh = 1; - return; + return ed; } } @@ -1811,6 +1830,7 @@ static void close_editor(struct editor *ed) { new_file(ed, ""); } ed->refresh = 1; + return ed; } static void pipe_command(struct editor *ed) { @@ -2111,7 +2131,7 @@ static void edit(struct editor *ed) { case ctrl('e'): select_toggle(ed); break; case ctrl('a'): select_all(ed); break; - case ctrl('c'): copy_selection(ed); break; + case ctrl('c'): copy_selection(ed);select_toggle(ed); break; case ctrl('f'): find_text(ed, 0); break; case ctrl('l'): goto_line(ed); break; case ctrl('g'): find_text(ed, 1); break; @@ -2134,15 +2154,7 @@ static void edit(struct editor *ed) { case ctrl('s'): save_editor(ed); break; case ctrl('p'): pipe_command(ed); break; #endif -#if defined(__rtems__) - /* - * Coverity spotted this as using ed after free() so changing - * the order of the statements. - */ - case ctrl('w'): ed = ed->env->current; close_editor(ed); break; -#else - case ctrl('w'): close_editor(ed); ed = ed->env->current; break; -#endif + case ctrl('w'): ed = close_editor(ed); break; } } } diff --git a/cpukit/libmisc/shell/main_exit.c b/cpukit/libmisc/shell/main_exit.c index e44f853494..b1ad9579ba 100644 --- a/cpukit/libmisc/shell/main_exit.c +++ b/cpukit/libmisc/shell/main_exit.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief exit Shell Command Implmentation + */ + /* - * exit Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_flashdev.c b/cpukit/libmisc/shell/main_flashdev.c new file mode 100644 index 0000000000..ca2454b33c --- /dev/null +++ b/cpukit/libmisc/shell/main_flashdev.c @@ -0,0 +1,584 @@ +/* + * Copyright (C) 2023 Aaron Nyholm + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> + +#include <errno.h> +#include <rtems/shell.h> + +#include <dev/flash/flashdev.h> + +static int flashdev_shell_read(char *dev_path, int argc, char *argv[]); +static int flashdev_shell_write(char *dev_path, int argc, char *argv[]); +static int flashdev_shell_erase(char *dev_path, int argc, char *argv[]); +static int flashdev_shell_type(char *dev_path); +static int flashdev_shell_jedecid(char *dev_path); +static int flashdev_shell_page_off(char *dev_path, int argc, char *argv[]); +static int flashdev_shell_page_idx(char *dev_path, int argc, char *argv[]); +static int flashdev_shell_pg_count(char *dev_path); +static int flashdev_shell_wb_size(char *dev_path); + +static int flashdev_shell_ioctl_value( + char *dev_path, + int ioctl_call, + void *ret +); + +static int flashdev_shell_page( + char *dev_path, + int argc, + char *argv[], + int ioctl_call +); + +static const char rtems_flashdev_shell_usage [] = + "simple flash read / write / erase\n" + "\n" + "flashdev <FLASH_DEV_PATH> [OPTION]\n" + " -r <address> <bytes> Read at address for bytes\n" + " -w <address> <file> Write file to address\n" + " -e <address> <bytes> Erase at address for bytes\n" + " -t Print the flash type\n" + " -d Print the JEDEC ID of flash device\n" + " -o <address> Print the page information of page at address\n" + " -i <index> Print the page information of page at index\n" + " -p Print the number of pages\n" + " -b Print the write block size\n" + " -h Print this help\n"; + + +static int rtems_flashdev_shell_main( int argc, char *argv[] ) { + + char *dev_path = NULL; + int i; + + for (i = 1; i < argc; ++i) { + if (argv[i][0] == '-') { + /* + * Check that a path to flashdev has been provided before running + * command. + */ + if (dev_path == NULL) { + printf("Please input FLASH_DEV_PATH before instruction\n"); + return 1; + } + /* Run command */ + switch (argv[i][1]) { + case ('r'): + /* Read */ + return flashdev_shell_read(dev_path, argc, &argv[i]); + case ('w'): + /* Write */ + return flashdev_shell_write(dev_path, argc, &argv[i]); + case ('e'): + /* Erase */ + return flashdev_shell_erase(dev_path, argc, &argv[i]); + case ('t'): + /* Flash Type */ + return flashdev_shell_type(dev_path); + case ('d'): + /* JEDEC Id */ + return flashdev_shell_jedecid(dev_path); + case ('o'): + /* Page info by offset */ + return flashdev_shell_page_off(dev_path, argc, &argv[i]); + case ('i'): + /* Page info by index */ + return flashdev_shell_page_idx(dev_path, argc, &argv[i]); + case ('p'): + /* Page count */ + return flashdev_shell_pg_count(dev_path); + case ('b'): + /* Write block size */ + return flashdev_shell_wb_size(dev_path); + case ('h'): + default: + /* Help */ + printf(rtems_flashdev_shell_usage); + break; + } + } else if (dev_path == NULL) { + dev_path = argv[i]; + } else { + printf("Invalid argument: %s\n", argv[i]); + return 1; + } + } + + if (argc == 1) { + printf(rtems_flashdev_shell_usage); + } + + return 0; +} + +int flashdev_shell_read( + char *dev_path, + int argc, + char *argv[] +) +{ + uint32_t address; + uint32_t bytes; + int fd; + int status; + void *buffer; + + /* Check arguments */ + if (argc < 5) { + printf("Missing argument\n"); + return -1; + } + + /* Get arguments */ + errno = 0; + address = (uint32_t) strtoul(argv[1], NULL, 0); + if (errno != 0) { + printf("Could not read address\n"); + } + errno = 0; + bytes = (uint32_t) strtoul(argv[2], NULL, 0); + if (errno != 0) { + printf("Could not read address\n"); + } + + /* Open flash device */ + fd = open(dev_path, O_RDONLY); + if (fd == -1) { + printf("Couldn't open %s\n", dev_path); + return -1; + } + + /* Move to address */ + status = lseek(fd, address, SEEK_SET); + if (status == -1) { + printf("Reading failed\n"); + close(fd); + return -1; + } + + /* Create a buffer to read into */ + buffer = calloc((bytes + bytes%4), 1); + if (buffer == NULL) { + printf("Failed to allocate read buffer\n"); + close(fd); + return -1; + } + + /* Read into buffer */ + status = read(fd, buffer, bytes); + if (status == -1) { + printf("Reading failed\n"); + free(buffer); + close(fd); + return -1; + } + + /* Print buffer out in 32bit blocks */ + printf("Reading %s at 0x%08x for %d bytes\n", dev_path, address, bytes); + for (int i = 0; i < (bytes/4); i++) { + printf("%08x ", ((uint32_t*)buffer)[i]); + if ((i+1)%4 == 0) { + printf("\n"); + } + } + printf("\n"); + + /* Clean up */ + free(buffer); + close(fd); + return 0; +} + +int flashdev_shell_write( + char *dev_path, + int argc, + char *argv[] +) +{ + uint32_t address; + int flash; + int file; + int status; + int read_len; + off_t length; + void *buffer; + uint32_t offset; + char *file_path; + + /* Check arguments */ + if (argc < 5) { + printf("Missing argument\n"); + return -1; + } + + /* Get arguments */ + errno = 0; + address = (uint32_t) strtoul(argv[1], NULL, 0); + if (errno != 0) { + printf("Could not read address\n"); + } + errno = 0; + file_path = argv[2]; + + /* Open flash device and move to write offset */ + flash = open(dev_path, O_WRONLY); + if (flash == -1) { + printf("Couldn't open %s\n", dev_path); + return -1; + } + status = lseek(flash, address, SEEK_SET); + if (status == -1) { + printf("Reading failed\n"); + close(flash); + return -1; + } + + /* Open file and get file length */ + file = open(file_path, O_RDONLY); + if (file == -1) { + printf("Couldn't open %s\n", file_path); + close(flash); + return -1; + } + + length = lseek(file, 0, SEEK_END); + if (length == -1) { + close(flash); + close(file); + printf("Couldn't find length of file\n"); + return -1; + } + + if (lseek(file, 0, SEEK_SET) == -1) { + close(flash); + close(file); + printf("Couldn't find length of file\n"); + return -1; + } + + /* Create buffer */ + buffer = calloc(1, 0x1000); + + /* Write file to flash device in 0x1000 byte chunks */ + offset = 0; + while (offset != length) { + + read_len = length - offset; + if (read_len > 0x1000) { + read_len = 0x1000; + } + + status = read(file, buffer, read_len); + if (status == -1) { + free(buffer); + close(flash); + close(file); + printf("Can't read %s\n", file_path); + return -1; + } + + status = write(flash, buffer, read_len); + if (status == -1) { + free(buffer); + close(flash); + close(file); + printf("Can't write %s\n", dev_path); + return -1; + } + + offset = offset + read_len; + } + + /* Clean up */ + close(flash); + close(file); + free(buffer); + return 0; +} + +int flashdev_shell_erase( + char *dev_path, + int argc, + char *argv[] +) +{ + uint32_t address; + uint32_t bytes; + int fd; + int status; + rtems_flashdev_region args; + + /* Check arguments */ + if (argc < 5) { + printf("Missing argument\n"); + return -1; + } + + /* Get arguments */ + errno = 0; + address = (uint32_t) strtoul(argv[1], NULL, 0); + if (errno != 0) { + printf("Could not read address\n"); + } + errno = 0; + bytes = (uint32_t) strtoul(argv[2], NULL, 0); + if (errno != 0) { + printf("Could not read address\n"); + } + + /* Open flash device */ + fd = open(dev_path, O_RDWR); + if (fd == -1) { + printf("Couldn't open %s\n", dev_path); + return -1; + } + + printf("Erasing at %08x for %x bytes\n", address, bytes); + + /* Erase flash */ + args.offset = address; + args.size = bytes; + + status = ioctl(fd, RTEMS_FLASHDEV_IOCTL_ERASE, &args); + if (status == -1) { + printf("Erase failed\n"); + close(fd); + return -1; + } + + /* Clean up */ + close(fd); + + return 0; +} + +int flashdev_shell_type( char *dev_path ) +{ + int type; + int status; + + /* Get type */ + status = flashdev_shell_ioctl_value( + dev_path, + RTEMS_FLASHDEV_IOCTL_TYPE, + &type + ); + + if (status) { + printf("Failed to get flash type\n"); + return status; + } + + /* Print type */ + switch(type) { + case RTEMS_FLASHDEV_NOR: + printf("NOR flash\n"); + break; + case RTEMS_FLASHDEV_NAND: + printf("NAND flash\n"); + break; + default: + printf("Unknown type\n"); + } + + return 0; +} + +int flashdev_shell_jedecid( char *dev_path ) { + uint32_t ret; + int status; + + /* Get JEDEC Id */ + status = flashdev_shell_ioctl_value( + dev_path, + RTEMS_FLASHDEV_IOCTL_JEDEC_ID, + &ret + ); + + /* Print JEDEC Id */ + if (status) { + printf("Failed to get JEDEC Id\n"); + return status; + } else { + printf("JEDEC Id: 0x%x\n", ret); + } + return 0; +} + +static int flashdev_shell_page_off( + char *dev_path, + int argc, + char *argv[] +) +{ + return flashdev_shell_page( + dev_path, + argc, + argv, + RTEMS_FLASHDEV_IOCTL_PAGEINFO_BY_OFFSET + ); +} + +static int flashdev_shell_page_idx( + char *dev_path, + int argc, + char *argv[] +) +{ + return flashdev_shell_page( + dev_path, + argc, + argv, + RTEMS_FLASHDEV_IOCTL_PAGEINFO_BY_INDEX + ); +} + +static int flashdev_shell_pg_count( char *dev_path ) +{ + uint32_t ret; + int status; + + /* Get Page Count */ + status = flashdev_shell_ioctl_value( + dev_path, + RTEMS_FLASHDEV_IOCTL_PAGE_COUNT, + &ret + ); + + /* Print Page Count */ + if (status) { + printf("Failed to get page count\n"); + return status; + } else { + printf("Page count: 0x%x\n", ret); + } + return 0; +} + +static int flashdev_shell_wb_size( char *dev_path ) +{ + size_t ret; + int status; + + /* Get Write Block Size */ + status = flashdev_shell_ioctl_value( + dev_path, + RTEMS_FLASHDEV_IOCTL_WRITE_BLOCK_SIZE, + &ret + ); + + /* Print Write Block Size */ + if (status) { + printf("Failed to get write block size\n"); + return status; + } else { + printf("Write block size: 0x%zx\n", ret); + } + return 0; +} + +static int flashdev_shell_ioctl_value( + char *dev_path, + int ioctl_call, + void *ret +) +{ + int fd; + int status; + + fd = open(dev_path, O_RDONLY); + if (fd == -1) { + printf("Couldn't open %s\n", dev_path); + return -1; + } + + status = ioctl(fd, ioctl_call, ret); + if (status == -1) { + close(fd); + return -1; + } + + close(fd); + return 0; +} + +static int flashdev_shell_page( + char *dev_path, + int argc, + char *argv[], + int ioctl_call +) +{ + rtems_flashdev_ioctl_page_info pg_info; + int fd; + int status; + + /* Check arguments */ + if (argc < 4) { + printf("Missing argument\n"); + return -1; + } + + /* Get arguments */ + errno = 0; + pg_info.location = (off_t) strtoul(argv[1], NULL, 0); + if (errno != 0) { + printf("Could not read address\n"); + } + + /* Open flash device */ + fd = open(dev_path, O_RDWR); + if (fd == -1) { + printf("Couldn't open %s\n", dev_path); + return -1; + } + + status = ioctl(fd, ioctl_call, &pg_info); + if (status == -1) { + printf("Failed to get page info\n"); + close(fd); + return -1; + } + + printf( + "Page offset: 0x%jx\nPage length: 0x%zx\n", + pg_info.page_info.offset, + pg_info.page_info.size + ); + + /* Clean up */ + close(fd); + return 0; +} + +rtems_shell_cmd_t rtems_shell_FLASHDEV_Command = { + .name = "flashdev", + .usage = rtems_flashdev_shell_usage, + .topic = "misc", + .command = rtems_flashdev_shell_main, +}; diff --git a/cpukit/libmisc/shell/main_getenv.c b/cpukit/libmisc/shell/main_getenv.c index 034253fdc5..2e258e90b7 100644 --- a/cpukit/libmisc/shell/main_getenv.c +++ b/cpukit/libmisc/shell/main_getenv.c @@ -1,5 +1,34 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief Get an environment variable + */ + /* - * Get an environment vairable. + * COPYRIGHT (C) 2009 Chris Johns <chrisj@rtems.org> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/shell/main_help.c b/cpukit/libmisc/shell/main_help.c index 564bc30a9c..e6d939d08f 100644 --- a/cpukit/libmisc/shell/main_help.c +++ b/cpukit/libmisc/shell/main_help.c @@ -22,23 +22,34 @@ #include "internal.h" #include <string.h> +static int rtems_shell_help_pause(int line, int lines) { + if (lines && line >= lines - 1) { + printf("\rPress any key to continue..."); + (void) getchar(); + printf("\r%*c\r", 29, ' '); + line = 0; + } + return line; +} + /* * show the help for one command. */ static int rtems_shell_help_cmd( - const rtems_shell_cmd_t *shell_cmd + const rtems_shell_cmd_t *shell_cmd, int indent, int line, + int cols, int lines ) { const char * pc; - int col,line; + int col; if (!rtems_shell_can_see_cmd(shell_cmd)) { return 0; } - printf("%-12.12s - ",shell_cmd->name); - col = 14; - line = 1; + printf("%-*s - ", indent, shell_cmd->name); + indent += 3; + col = indent; if (shell_cmd->alias) { printf("is an <alias> for command '%s'",shell_cmd->alias->name); } else if (shell_cmd->usage) { @@ -48,8 +59,10 @@ static int rtems_shell_help_cmd( case '\r': break; case '\n': - putchar('\n'); - col = 0; + if (*(pc + 1) != '\0') { + putchar('\n'); + col = 0; + } break; default: putchar(*pc); @@ -57,19 +70,21 @@ static int rtems_shell_help_cmd( break; } pc++; - if (col>78) { /* What daring... 78?*/ + if (col > (cols - 3)) { if (*pc) { putchar('\n'); col = 0; } } - if (!col && *pc) { - printf(" "); - col = 12;line++; + if (col == 0 && *pc) { + line = rtems_shell_help_pause(line + 1, lines); + printf("%*c", indent, ' '); + col = indent; } } } puts(""); + line = rtems_shell_help_pause(line + 1, lines); return line; } @@ -83,15 +98,27 @@ static int rtems_shell_help( char * argv[] ) { - int col,line,lines,arg; - char* lines_env; + int col,line,cols,lines,arg,indent; + char *lines_env, *cols_env; rtems_shell_topic_t *topic; + rtems_shell_cmd_t *shell_cmd; + lines = 16; + cols = 80; lines_env = getenv("SHELL_LINES"); - if (lines_env) + if (lines_env) { lines = strtol(lines_env, 0, 0); - else - lines = 16; + } else { + lines_env = getenv("LINES"); + if (lines_env) { + lines = strtol(lines_env, 0, 0); + } + } + + cols_env = getenv("COLUMNS"); + if (cols_env) { + cols = strtol(cols_env, 0, 0); + } if (argc<2) { printf("help: The topics are\n"); @@ -101,7 +128,7 @@ static int rtems_shell_help( if (!col){ col = printf(" %s",topic->topic); } else { - if ((col+strlen(topic->topic)+2)>78){ + if ((col+strlen(topic->topic)+2)>(cols - 2)){ printf("\n"); col = printf(" %s",topic->topic); } else { @@ -113,18 +140,19 @@ static int rtems_shell_help( printf("\n"); return 1; } + indent = 0; + shell_cmd = rtems_shell_first_cmd; + while (shell_cmd) { + size_t len = strlen(shell_cmd->name); + if (len > indent) { + indent = len; + } + shell_cmd = shell_cmd->next; + } line = 0; for (arg = 1;arg<argc;arg++) { const char *cur = argv[arg]; - rtems_shell_cmd_t *shell_cmd; - - if (lines && (line > lines)) { - printf("Press any key to continue..."); - (void) getchar(); /* we only want to know a character was pressed */ - printf("\n"); - line = 0; - } - topic = rtems_shell_lookup_topic(cur); + topic = rtems_shell_lookup_topic(cur); if (topic == NULL) { if ((shell_cmd = rtems_shell_lookup_cmd(cur)) == NULL) { if (strcmp(cur, "all") != 0) { @@ -132,11 +160,11 @@ static int rtems_shell_help( "help: topic or cmd '%s' not found. Try <help> alone for a list\n", cur ); - line++; + line = rtems_shell_help_pause(line + 1, lines); continue; } } else { - line+= rtems_shell_help_cmd(shell_cmd); + line = rtems_shell_help_cmd(shell_cmd, indent, line, cols, lines); continue; } } @@ -144,18 +172,12 @@ static int rtems_shell_help( line++; shell_cmd = rtems_shell_first_cmd; while (shell_cmd) { - if (topic == NULL || !strcmp(topic->topic,shell_cmd->topic)) - line+= rtems_shell_help_cmd(shell_cmd); - if (lines && (line > lines)) { - printf("Press any key to continue..."); - (void) getchar(); - printf("\n"); - line = 0; + if (topic == NULL || !strcmp(topic->topic,shell_cmd->topic)) { + line = rtems_shell_help_cmd(shell_cmd, indent, line, cols, lines); } shell_cmd = shell_cmd->next; } } - puts(""); return 0; } diff --git a/cpukit/libmisc/shell/main_i2cdetect.c b/cpukit/libmisc/shell/main_i2cdetect.c index e953b4eaef..1a863434b7 100644 --- a/cpukit/libmisc/shell/main_i2cdetect.c +++ b/cpukit/libmisc/shell/main_i2cdetect.c @@ -1,7 +1,7 @@ /* * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (C) 2020 embedded brains GmbH. + * Copyright (C) 2020 embedded brains GmbH & Co. KG * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/cpukit/libmisc/shell/main_i2cget.c b/cpukit/libmisc/shell/main_i2cget.c index ffa551308b..5726c6ea14 100644 --- a/cpukit/libmisc/shell/main_i2cget.c +++ b/cpukit/libmisc/shell/main_i2cget.c @@ -1,7 +1,7 @@ /* * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (C) 2020 embedded brains GmbH. + * Copyright (C) 2020 embedded brains GmbH & Co. KG * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/cpukit/libmisc/shell/main_i2cset.c b/cpukit/libmisc/shell/main_i2cset.c index d9025b3b28..cdc42a57f9 100644 --- a/cpukit/libmisc/shell/main_i2cset.c +++ b/cpukit/libmisc/shell/main_i2cset.c @@ -1,7 +1,7 @@ /* * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (C) 2020 embedded brains GmbH. + * Copyright (C) 2020 embedded brains GmbH & Co. KG * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/cpukit/libmisc/shell/main_id.c b/cpukit/libmisc/shell/main_id.c index 2d2b05fe11..bd1906cab1 100644 --- a/cpukit/libmisc/shell/main_id.c +++ b/cpukit/libmisc/shell/main_id.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief ID Command Implementation + */ + /* - * ID Command Implementation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_logoff.c b/cpukit/libmisc/shell/main_logoff.c index 67a2967228..99ed957161 100644 --- a/cpukit/libmisc/shell/main_logoff.c +++ b/cpukit/libmisc/shell/main_logoff.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief LOGOFF Shell Command Implmentation + */ + /* - * LOGOFF Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_lsof.c b/cpukit/libmisc/shell/main_lsof.c index 57e81c0295..2cc35f96fe 100644 --- a/cpukit/libmisc/shell/main_lsof.c +++ b/cpukit/libmisc/shell/main_lsof.c @@ -1,11 +1,5 @@ /* - * Copyright (c) 2012-2014 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Copyright (C) 2012, 2014 embedded brains GmbH & Co. KG * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_mdump.c b/cpukit/libmisc/shell/main_mdump.c index 7f49480927..214b57c401 100644 --- a/cpukit/libmisc/shell/main_mdump.c +++ b/cpukit/libmisc/shell/main_mdump.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief MDUMP Shell Command Implmentation + */ + /* - * MDUMP Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * Reworked by Ric Claus at SLAC.Stanford.edu * diff --git a/cpukit/libmisc/shell/main_medit.c b/cpukit/libmisc/shell/main_medit.c index d14a518800..e175868cac 100644 --- a/cpukit/libmisc/shell/main_medit.c +++ b/cpukit/libmisc/shell/main_medit.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief MEDIT Shell Command Implmentation + */ + /* - * MEDIT Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_mfill.c b/cpukit/libmisc/shell/main_mfill.c index 47a55d3a2f..4ac6bfcf31 100644 --- a/cpukit/libmisc/shell/main_mfill.c +++ b/cpukit/libmisc/shell/main_mfill.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief MFILL Shell Command Implmentation + */ + /* - * MFILL Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_mkdir.c b/cpukit/libmisc/shell/main_mkdir.c index 5595bfd3fd..c3027800bc 100644 --- a/cpukit/libmisc/shell/main_mkdir.c +++ b/cpukit/libmisc/shell/main_mkdir.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief MKDIR Shell Command Implmentation + */ + /* - * MKDIR Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_mmove.c b/cpukit/libmisc/shell/main_mmove.c index a319355444..0029882d62 100644 --- a/cpukit/libmisc/shell/main_mmove.c +++ b/cpukit/libmisc/shell/main_mmove.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief MMOVE Shell Command Implmentation + */ + /* - * MMOVE Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at @@ -60,7 +62,7 @@ static int rtems_shell_main_mmove( /* * Now copy the memory. */ - memcpy(dst, src, length); + memmove(dst, src, length); return 0; } diff --git a/cpukit/libmisc/shell/main_mount.c b/cpukit/libmisc/shell/main_mount.c index d326a59097..5a6b36cede 100644 --- a/cpukit/libmisc/shell/main_mount.c +++ b/cpukit/libmisc/shell/main_mount.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief Shell Command Implmentation + */ + /* - * Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_mount_nfs.c b/cpukit/libmisc/shell/main_mount_nfs.c index 8a2aaa4b29..c0ad3ebdb0 100644 --- a/cpukit/libmisc/shell/main_mount_nfs.c +++ b/cpukit/libmisc/shell/main_mount_nfs.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief Shell Command Implmentation + */ + /* - * Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_pci.c b/cpukit/libmisc/shell/main_pci.c index 08fdae78ae..4902ed07b9 100644 --- a/cpukit/libmisc/shell/main_pci.c +++ b/cpukit/libmisc/shell/main_pci.c @@ -1,11 +1,30 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /* LIBPCI Command Implementation * * COPYRIGHT (c) 2010. * Cobham Gaisler AB. * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.com/license/LICENSE. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H @@ -356,7 +375,7 @@ static int shell_pci_infodev( printf(" PCIID: 0x%04x\n", dev->busdevfun); bus = dev->bus; if (!bus) { - printf(" AT BUS: 0x%x via Host Bridge\n", bus->num); + printf(" AT BUS: via Host Bridge\n"); } else { printf(" AT BUS: 0x%x via Bridge at [%x:%x:%x]\n", bus->num, PCI_DEV_EXPAND(bus->dev.busdevfun)); diff --git a/cpukit/libmisc/shell/main_profreport.c b/cpukit/libmisc/shell/main_profreport.c index 2504282ae3..ab14cc1e49 100644 --- a/cpukit/libmisc/shell/main_profreport.c +++ b/cpukit/libmisc/shell/main_profreport.c @@ -1,11 +1,5 @@ /* - * Copyright (c) 2015 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Copyright (c) 2015 embedded brains GmbH & Co. KG * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_pwd.c b/cpukit/libmisc/shell/main_pwd.c index ea657dc848..1e3ef450e8 100644 --- a/cpukit/libmisc/shell/main_pwd.c +++ b/cpukit/libmisc/shell/main_pwd.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief PWD Shell Command Implmentation + */ + /* - * PWD Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_rmdir.c b/cpukit/libmisc/shell/main_rmdir.c index 250da83d27..b9cde24886 100644 --- a/cpukit/libmisc/shell/main_rmdir.c +++ b/cpukit/libmisc/shell/main_rmdir.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief RMDIR Shell Command Implmentation + */ + /* - * RMDIR Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_rtc.c b/cpukit/libmisc/shell/main_rtc.c index 320281b60b..940c7c9b52 100644 --- a/cpukit/libmisc/shell/main_rtc.c +++ b/cpukit/libmisc/shell/main_rtc.c @@ -5,12 +5,7 @@ */ /* - * Copyright (c) 2009 - * embedded brains GmbH - * Obere Lagerstr. 30 - * D-82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Copyright (c) 2009 embedded brains GmbH & Co. KG * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_rtems.c b/cpukit/libmisc/shell/main_rtems.c new file mode 100644 index 0000000000..956c6bcb72 --- /dev/null +++ b/cpukit/libmisc/shell/main_rtems.c @@ -0,0 +1,156 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup + * + * @brief This source file contains the kernel command. + */ + +/* + * Copyright (c) 2022 Chris Johns. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> + +#include <rtems.h> +#include <rtems/shell.h> +#include <rtems/version.h> + +static void kernel_summary(void) { + printf( + "RTEMS: %d.%d.%d", + rtems_version_major(), rtems_version_minor(), rtems_version_revision()); + if (rtems_version_control_key_is_valid(rtems_version_control_key())) { + printf(" (%s)", rtems_version_control_key()); + } +#if RTEMS_SMP + printf(" SMP:%d cores", rtems_scheduler_get_processor_maximum()); +#endif + printf("\n"); +} + +static void cpu_summary(void) { + printf("CPU: " CPU_NAME " (" CPU_MODEL_NAME ")\n"); +} + +static void bsp_summary(void) { + printf("BSP: %s\n", rtems_board_support_package()); +} + +static void tools_summary(void) { + printf( "Tools: " __VERSION__ "\n"); +} + +static void opts_summary(void) { + printf("Options:" +#if RTEMS_DEBUG + " DEBUG" +#endif +#if RTEMS_MULTIPROCESSING + " MULTIPROCESSING" +#endif +#if RTEMS_NETWORKING + " NETWORKING" +#endif +#if RTEMS_PARAVIRT + " PARAVIRT" +#endif +#if RTEMS_POSIX_API + " POSIX" +#endif +#if RTEMS_PROFILING + " PROFILING" +#endif +#if RTEMS_SMP + " SMP" +#endif + "\n"); +} + +static void help(void) { + printf( "Usage:: rtems <command>\n"); + printf( " where <command> is:\n"); + printf( " help : this help\n"); + printf( " ver : kernel version\n"); + printf( " cpu : kernel version\n"); + printf( " bsp : BSP name\n"); + printf( " tools : tools version\n"); + printf( " opts : options\n"); + printf( " all : all commands\n"); +} + +static int rtems_shell_main_rtems( + int argc, char *argv[]) { + + if (argc == 1) { + kernel_summary(); + } else if (argc == 2) { + if (strcmp(argv[1], "help") == 0) { + help(); + } else if (strcmp(argv[1], "ver") == 0) { + kernel_summary(); + } else if (strcmp(argv[1], "cpu") == 0) { + cpu_summary(); + } else if (strcmp(argv[1], "bsp") == 0) { + bsp_summary(); + } else if (strcmp(argv[1], "tools") == 0) { + tools_summary(); + } else if (strcmp(argv[1], "opts") == 0) { + opts_summary(); + } else if (strcmp(argv[1], "all") == 0) { + kernel_summary(); + cpu_summary(); + bsp_summary(); + tools_summary(); + opts_summary(); + } else { + printf("error: invalid command\n"); + return 1; + } + } else { + printf("error: invalid command\n"); + return 1; + } + return 0; +} + +#define HELP_LINE \ + "rtems <command> (eg. help)" + +rtems_shell_cmd_t rtems_shell_RTEMS_Command = { + "rtems", /* name */ + HELP_LINE, /* usage */ + "rtems", /* topic */ + rtems_shell_main_rtems, /* command */ + NULL, /* alias */ + NULL, /* next */ + 0500, /* mode */ + 0, /* uid */ + 0 /* gid */ +}; diff --git a/cpukit/libmisc/shell/main_setenv.c b/cpukit/libmisc/shell/main_setenv.c index a50f1a609c..ae8de67689 100644 --- a/cpukit/libmisc/shell/main_setenv.c +++ b/cpukit/libmisc/shell/main_setenv.c @@ -1,5 +1,34 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief Set an environment variable + */ + /* - * Set an environment vairable. + * COPYRIGHT (C) 2009 Chris Johns <chrisj@rtems.org> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/shell/main_spi.c b/cpukit/libmisc/shell/main_spi.c index 487a22fc6c..9c47ba0054 100644 --- a/cpukit/libmisc/shell/main_spi.c +++ b/cpukit/libmisc/shell/main_spi.c @@ -1,7 +1,7 @@ /* * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (C) 2020 embedded brains GmbH. + * Copyright (C) 2020 embedded brains GmbH & Co. KG * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/cpukit/libmisc/shell/main_tty.c b/cpukit/libmisc/shell/main_tty.c index 29dc673dbb..9b884a612c 100644 --- a/cpukit/libmisc/shell/main_tty.c +++ b/cpukit/libmisc/shell/main_tty.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief TTY Shell Command Implmentation + */ + /* - * TTY Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_umask.c b/cpukit/libmisc/shell/main_umask.c index 66cd102195..a5c983d126 100644 --- a/cpukit/libmisc/shell/main_umask.c +++ b/cpukit/libmisc/shell/main_umask.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief UMASK Shell Command Implmentation + */ + /* - * UMASK Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_unmount.c b/cpukit/libmisc/shell/main_unmount.c index e7e5fddc68..8c56727f42 100644 --- a/cpukit/libmisc/shell/main_unmount.c +++ b/cpukit/libmisc/shell/main_unmount.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief Shell Command Implmentation + */ + /* - * Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_unsetenv.c b/cpukit/libmisc/shell/main_unsetenv.c index af350c9283..60ba705f08 100644 --- a/cpukit/libmisc/shell/main_unsetenv.c +++ b/cpukit/libmisc/shell/main_unsetenv.c @@ -1,5 +1,34 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief Unset an environment variable + */ + /* - * Unset an environment vairable. + * COPYRIGHT (C) 2009 Chris Johns <chrisj@rtems.org> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/shell/main_whoami.c b/cpukit/libmisc/shell/main_whoami.c index 8771c66c50..d2183266e6 100644 --- a/cpukit/libmisc/shell/main_whoami.c +++ b/cpukit/libmisc/shell/main_whoami.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief WHOAMI Shell Command Implmentation + */ + /* - * WHOAMI Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/shell-wait-for-input.c b/cpukit/libmisc/shell/shell-wait-for-input.c index 69ab883dc0..60d6ea4225 100644 --- a/cpukit/libmisc/shell/shell-wait-for-input.c +++ b/cpukit/libmisc/shell/shell-wait-for-input.c @@ -1,11 +1,5 @@ /* - * Copyright (c) 2011 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Obere Lagerstr. 30 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Copyright (c) 2011 embedded brains GmbH & Co. KG * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/shell.c b/cpukit/libmisc/shell/shell.c index 1e5962b1e3..9cefc80255 100644 --- a/cpukit/libmisc/shell/shell.c +++ b/cpukit/libmisc/shell/shell.c @@ -1,11 +1,11 @@ -/* - * - * Instantatiate a new terminal shell. - * - * Author: +/** + * @file * - * WORK: fernando.ruiz@ctv.es - * HOME: correo@fernando-ruiz.com + * @brief Instantatiate a new terminal shell. + */ + +/* + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at @@ -49,11 +49,13 @@ #define shell_std_debug(...) #endif +#define SHELL_MAGIC rtems_build_name('S', 'E', 'N', 'V') + const rtems_shell_env_t rtems_global_shell_env = { - .magic = rtems_build_name('S', 'E', 'N', 'V'), + .magic = SHELL_MAGIC, .managed = false, .devname = CONSOLE_DEVICE_NAME, - .taskname = "SHGL", + .taskname = "RTSH", .exit_shell = false, .forever = true, .echo = false, @@ -198,6 +200,8 @@ static bool rtems_shell_set_shell_env( rtems_shell_env_key_handle *handle; int eno; + rtems_shell_init_environment(); + handle = malloc(sizeof(rtems_shell_env_key_handle)); if (handle == NULL) { rtems_error(0, "no memory for shell env key handle)"); @@ -267,12 +271,13 @@ void rtems_shell_dup_current_env(rtems_shell_env_t *copy) if (env != NULL) { shell_std_debug("dup: existing parent\n"); *copy = *env; - } - else { + + /* + * Duplicated environments are not managed. + */ + copy->managed = false; + } else { *copy = rtems_global_shell_env; - copy->magic = rtems_build_name('S', 'E', 'N', 'V'); - copy->devname = CONSOLE_DEVICE_NAME; - copy->taskname = "RTSH"; copy->parent_stdout = stdout; copy->parent_stdin = stdin; copy->parent_stderr = stderr; @@ -281,10 +286,6 @@ void rtems_shell_dup_current_env(rtems_shell_env_t *copy) fileno(copy->parent_stdout), copy->parent_stdout, fileno(copy->parent_stdin), copy->parent_stdin); } - /* - * Duplicated environments are not managed. - */ - copy->managed = false; } /* @@ -313,32 +314,21 @@ static int rtems_shell_line_editor( int c; int col; int last_col; - int output; char line[size]; char new_line[size]; int up; int cmd = -1; int inserting = 1; int in_fileno = fileno(in); - int out_fileno; - - _Assert(out != NULL); - out_fileno = fileno(out); - - /* - * Only this task can use this file descriptor because calling - * fileno will block if another thread call made a call on this - * descriptor. - */ - output = (out && isatty(in_fileno)); col = last_col = 0; tcdrain(in_fileno); - if (out) - tcdrain(out_fileno); + if (out != NULL) { + tcdrain(fileno(out)); + } - if (output && prompt) + if (out != NULL && prompt != NULL) fprintf(out, "\r%s", prompt); line[0] = 0; @@ -346,7 +336,7 @@ static int rtems_shell_line_editor( for (;;) { - if (output) + if (out != NULL) fflush(out); extended_key = rtems_shell_getchar(in); @@ -368,15 +358,14 @@ static int rtems_shell_line_editor( switch (c) { case RTEMS_SHELL_KEYS_END: - if (output) + if (out != NULL) fprintf(out, "%s", line + col); col = (int) strlen (line); break; case RTEMS_SHELL_KEYS_HOME: - if (output) { - if (prompt) - fprintf(out,"\r%s", prompt); + if (out != NULL && prompt != NULL) { + fprintf(out,"\r%s", prompt); } col = 0; break; @@ -407,7 +396,7 @@ static int rtems_shell_line_editor( int end; int bs; rtems_shell_move_left(line + col, 1); - if (output) { + if (out != NULL) { fprintf(out,"\r%s%s ", prompt, line); end = (int) strlen (line); for (bs = 0; bs < ((end - col) + 1); bs++) @@ -426,9 +415,8 @@ static int rtems_shell_line_editor( switch (c) { case 1: /*Control-a*/ - if (output) { - if (prompt) - fprintf(out,"\r%s", prompt); + if (out != NULL && prompt != NULL) { + fprintf(out,"\r%s", prompt); } col = 0; break; @@ -437,7 +425,7 @@ static int rtems_shell_line_editor( if (col > 0) { col--; - if (output) + if (out != NULL) fputc('\b', out); } break; @@ -446,7 +434,7 @@ static int rtems_shell_line_editor( if (strlen(line)) { if (col < strlen(line)) { rtems_shell_move_left(line + col, 1); - if (output) { + if (out != NULL) { int bs; fprintf(out,"%s \b", line + col); for (bs = 0; bs < ((int) strlen (line) - col); bs++) @@ -458,26 +446,26 @@ static int rtems_shell_line_editor( /* Fall through */ case EOF: - if (output) + if (out != NULL) fputc('\n', out); return -2; case 5: /*Control-e*/ - if (output) + if (out != NULL) fprintf(out, "%s", line + col); col = (int) strlen (line); break; case 6: /* Control-F */ if ((col < size) && (line[col] != '\0')) { - if (output) + if (out != NULL) fputc(line[col], out); col++; } break; case 7: /* Control-G */ - if (output) { + if (out != NULL) { /* * The (int) cast is needed because the width specifier (%*) * must be an int, but strlen() returns a size_t. Without @@ -492,7 +480,7 @@ static int rtems_shell_line_editor( case 11: /*Control-k*/ if (line[col]) { - if (output) { + if (out != NULL) { int end = strlen(line); int bs; fprintf(out,"%*c", end - col, ' '); @@ -504,7 +492,7 @@ static int rtems_shell_line_editor( break; case '\f': - if (output) { + if (out != NULL) { int end; int bs; fputc('\f',out); @@ -522,7 +510,7 @@ static int rtems_shell_line_editor( int bs; col--; rtems_shell_move_left(line + col, 1); - if (output) { + if (out != NULL) { fprintf(out,"\b%s \b", line + col); for (bs = 0; bs < ((int) strlen (line) - col); bs++) fputc('\b', out); @@ -536,7 +524,7 @@ static int rtems_shell_line_editor( /* * Process the command. */ - if (output) + if (out != NULL) fprintf(out,"\n"); /* @@ -564,7 +552,7 @@ static int rtems_shell_line_editor( case 16: /* Control-P */ if ((cmd >= (count - 1)) || (strlen(cmds[cmd + 1]) == 0)) { - if (output) + if (out != NULL) fputc('\x7', out); break; } @@ -584,7 +572,7 @@ static int rtems_shell_line_editor( cmd++; } else { if (cmd < 0) { - if (output) + if (out != NULL) fprintf(out, "\x7"); break; } @@ -602,7 +590,7 @@ static int rtems_shell_line_editor( col = strlen (line); - if (output) { + if (out != NULL) { fprintf(out,"\r%s%*c", prompt, clen, ' '); fprintf(out,"\r%s%s", prompt, line); } @@ -615,17 +603,17 @@ static int rtems_shell_line_editor( char tmp; if (col == strlen(line)) { col--; - if (output) + if (out != NULL) fprintf(out,"\b"); } tmp = line[col]; line[col] = line[col - 1]; line[col - 1] = tmp; - if (output) + if (out != NULL) fprintf(out,"\b%c%c", line[col - 1], line[col]); col++; } else { - if (output) + if (out != NULL) fputc('\x7', out); } break; @@ -639,7 +627,7 @@ static int rtems_shell_line_editor( int bs; rtems_shell_move_left(line, col); - if (output) { + if (out != NULL) { fprintf(out,"\r%s%*c", prompt, clen, ' '); fprintf(out,"\r%s%s", prompt, line); @@ -658,7 +646,7 @@ static int rtems_shell_line_editor( int ch, bs; for (ch = end + 1; ch > col; ch--) line[ch] = line[ch - 1]; - if (output) { + if (out != NULL) { fprintf(out, "%s", line + col); for (bs = 0; bs < (end - col + 1); bs++) fputc('\b', out); @@ -667,7 +655,7 @@ static int rtems_shell_line_editor( line[col++] = c; if (col > end) line[col] = '\0'; - if (output) + if (out != NULL) fputc(c, out); } break; @@ -817,6 +805,183 @@ void rtems_shell_print_env( } #endif +/* + * Wait for the string to return or timeout. + */ +static bool rtems_shell_term_wait_for(const int fd, const char* str, const int timeout) +{ + int msec = timeout; + int i = 0; + while (msec-- > 0 && str[i] != '\0') { + char ch[2]; + if (read(fd, &ch[0], 1) == 1) { + fflush(stdout); + if (ch[0] != str[i++]) { + return false; + } + msec = timeout; + } else { + usleep(1000); + } + } + if (msec == 0) { + return false; + } + return true; +} + +/* + * Buffer a string up to the end string + */ +static int rtems_shell_term_buffer_until(const int fd, + char* buf, + const int size, + const char* end, + const int timeout) +{ + int msec = timeout; + int i = 0; + int e = 0; + memset(&buf[0], 0, size); + while (msec-- > 0 && i < size && end[e] != '\0') { + char ch[2]; + if (read(fd, &ch[0], 1) == 1) { + fflush(stdout); + buf[i++] = ch[0]; + if (ch[0] == end[e]) { + e++; + } else { + e = 0; + } + msec = timeout; + } else { + usleep(1000); + } + } + if (msec == 0 || end[e] != '\0') { + return -1; + } + i -= e; + if (i < size) { + buf[i] = '\0'; + } + return i; +} + +/* + * Determine if the terminal has the row and column values + * swapped + * + * https://github.com/tmux/tmux/issues/3457 + * + * Tmux has a bug where the lines and cols are swapped. There is a lag + * in the time it takes to get the fix into code so see if tmux is + * running and which version and work around the bug. + * + * The terminal device needs to have VMIN=0, and VTIME=0 + */ +static bool rtems_shell_term_row_column_swapped(const int fd, const int timeout) { + char buf[64]; + memset(&buf[0], 0, sizeof(buf)); + /* + * CSI > Ps q + * Ps = 0 => DCS > | text ST + */ + fputs("\033[>0q", stdout); + fflush(stdout); + if (rtems_shell_term_wait_for(fd, "\033P>|", timeout)) { + int len = rtems_shell_term_buffer_until(fd, buf, sizeof(buf), "\033\\", timeout); + if (len > 0) { + if (memcmp(buf, "tmux ", 5) == 0) { + static const char* bad_versions[] = { + "3.2", "3.2a", "3.3", "3.3a" + }; + size_t i; + for (i = 0; i < RTEMS_ARRAY_SIZE(bad_versions); ++i) { + if (strcmp(bad_versions[i], buf + 5) == 0) { + return true; + } + } + } + } + } + return false; +} + +/* + * Direct method to get the size of an XTERM window. + * + * If you do not use an XTERM the env variables are not define. + */ +static void rtems_shell_winsize( void ) +{ + const int fd = fileno(stdin); + struct winsize ws; + const int timeout = 150; + char buf[64]; + bool ok = false; + int lines = 0; + int cols = 0; + int r; + r = ioctl(fd, TIOCGWINSZ, &ws); + if (r == 0) { + ok = true; + lines = ws.ws_row; + cols = ws.ws_col; + } else if (isatty(fd)) { + struct termios cterm; + if (tcgetattr(fd, &cterm) >= 0) { + struct termios term = cterm; + term.c_cc[VMIN] = 0; + term.c_cc[VTIME] = 0; + if (tcsetattr (fd, TCSADRAIN, &term) >= 0) { + memset(&buf[0], 0, sizeof(buf)); + /* + * https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Miscellaneous + * + * CSI 1 8 t + */ + fputs("\033[18t", stdout); + fflush(stdout); + if (rtems_shell_term_wait_for(fd, "\033[8;", timeout)) { + int len = rtems_shell_term_buffer_until(fd, buf, sizeof(buf), ";", timeout); + if (len > 0) { + int i; + lines = 0; + i = 0; + while (i < len) { + lines *= 10; + lines += buf[i++] - '0'; + } + len = rtems_shell_term_buffer_until(fd, buf, sizeof(buf), "t", timeout); + if (len > 0) { + cols = 0; + i = 0; + while (i < len) { + cols *= 10; + cols += buf[i++] - '0'; + } + ok = true; + } + } + } + } + if (rtems_shell_term_row_column_swapped(fd, timeout)) { + int tmp = lines; + lines = cols; + cols = tmp; + } + tcsetattr (fd, TCSADRAIN, &cterm); + } + } + if (ok) { + snprintf(buf, sizeof(buf) - 1, "%d", lines); + setenv("LINES", buf, 1); + snprintf(buf, sizeof(buf) - 1, "%d", cols); + setenv("COLUMNS", buf, 1); + } +} + static rtems_task rtems_shell_task(rtems_task_argument task_argument) { rtems_shell_env_t *shell_env = (rtems_shell_env_t*) task_argument; @@ -851,129 +1016,32 @@ static bool rtems_shell_init_user_env(void) #define RTEMS_SHELL_CMD_COUNT (32) #define RTEMS_SHELL_PROMPT_SIZE (128) -bool rtems_shell_main_loop( - rtems_shell_env_t *shell_env +static bool shell_main_loop( + rtems_shell_env_t *shell_env, + bool interactive, + FILE *line_editor_output ) { - struct termios term; - struct termios previous_term; - char *prompt = NULL; - int cmd; - int cmd_count = 1; /* assume a script and so only 1 command line */ - char *cmds[RTEMS_SHELL_CMD_COUNT]; - char *cmd_argv; - int argc; - char *argv[RTEMS_SHELL_MAXIMUM_ARGUMENTS]; - bool result = true; - bool input_file = false; - int line = 0; - FILE *stdinToClose = NULL; - FILE *stdoutToClose = NULL; - - rtems_shell_init_environment(); - - if (shell_env->magic != rtems_build_name('S', 'E', 'N', 'V')) { - rtems_error(0, "invalid shell environment passed to the main loop)"); - return false; - } - - if (!rtems_shell_set_shell_env(shell_env)) - return false; - - if (!rtems_shell_init_user_env()) { - rtems_error(0, "rtems_shell_init_user_env"); - rtems_shell_clear_shell_env(); - return false; - } - - shell_std_debug("env: %p\n", shell_env); - - if (shell_env->output == NULL || strcmp(shell_env->output, "stdout") == 0) { - if (shell_env->parent_stdout != NULL) - stdout = shell_env->parent_stdout; - } - else if (strcmp(shell_env->output, "stderr") == 0) { - if (shell_env->parent_stderr != NULL) - stdout = shell_env->parent_stderr; - else - stdout = stderr; - } else if (strcmp(shell_env->output, "/dev/null") == 0) { - if (stdout == NULL) { - fprintf(stderr, "shell: stdout is NULLs\n"); - rtems_shell_clear_shell_env(); - return false; - } - fclose (stdout); - } else { - FILE *output = fopen(shell_env->output, - shell_env->output_append ? "a" : "w"); - if (output == NULL) { - fprintf(stderr, "shell: open output %s failed: %s\n", - shell_env->output, strerror(errno)); - rtems_shell_clear_shell_env(); - return false; - } - stdout = output; - stdoutToClose = output; - } - - if (shell_env->input == NULL || strcmp(shell_env->input, "stdin") == 0) { - if (shell_env->parent_stdin != NULL) - stdin = shell_env->parent_stdin; - } else { - FILE *input = fopen(shell_env->input, "r"); - if (input == NULL) { - fprintf(stderr, "shell: open input %s failed: %s\n", - shell_env->input, strerror(errno)); - if (stdoutToClose != NULL) - fclose(stdoutToClose); - rtems_shell_clear_shell_env(); + bool result = false; + int line = 0; + int cmd_count; + char *cmds[RTEMS_SHELL_CMD_COUNT]; + char *cmd_argv; + char *prompt; + + if (interactive) { + prompt = malloc(RTEMS_SHELL_PROMPT_SIZE); + if (prompt == NULL) { + fprintf(stderr, "shell: cannot allocate prompt memory\n"); return false; } - stdin = input; - stdinToClose = input; - shell_env->forever = false; - input_file = true; - } - if (!input_file) { - if (stdin == NULL) { - fprintf(stderr, "shell: stdin is NULLs\n"); - if (stdoutToClose != NULL) - fclose(stdoutToClose); - rtems_shell_clear_shell_env(); - return false; - } - /* Make a raw terminal, Linux Manuals */ - if (tcgetattr(fileno(stdin), &previous_term) >= 0) { - term = previous_term; - term.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); - term.c_oflag &= ~OPOST; - term.c_oflag |= (OPOST|ONLCR); /* But with cr+nl on output */ - term.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); - term.c_cflag |= CLOCAL | CREAD; - term.c_cc[VMIN] = 1; - term.c_cc[VTIME] = 0; - if (tcsetattr (fileno(stdin), TCSADRAIN, &term) < 0) { - fprintf(stderr, - "shell: cannot set terminal attributes(%s)\n",shell_env->devname); - } - } cmd_count = RTEMS_SHELL_CMD_COUNT; - prompt = malloc(RTEMS_SHELL_PROMPT_SIZE); - if (!prompt) - fprintf(stderr, - "shell: cannot allocate prompt memory\n"); + } else { + prompt = NULL; + cmd_count = 1; } - shell_std_debug("child out: %d (%p)\n", fileno(stdout), stdout); - shell_std_debug("child in: %d (%p)\n", fileno(stdin), stdin); - - /* Do not buffer if interactive else leave buffered */ - if (!input_file) - setvbuf(stdin, NULL, _IONBF, 0); - setvbuf(stdout, NULL, _IONBF, 0); - /* * Allocate the command line buffers. */ @@ -988,6 +1056,7 @@ bool rtems_shell_main_loop( } if (cmd_argv && cmds[0]) { + size_t cmd; memset (cmds[0], 0, cmd_count * RTEMS_SHELL_CMD_SIZE); @@ -1018,23 +1087,25 @@ bool rtems_shell_main_loop( } if (result) { - const char *c; memset (cmds[0], 0, cmd_count * RTEMS_SHELL_CMD_SIZE); - if (!input_file) { + + if (interactive) { rtems_shell_cat_file(stdout,"/etc/motd"); fprintf(stdout, "\n" "RTEMS Shell on %s. Use 'help' to list commands.\n", shell_env->devname); - } - - if (input_file) - chdir(shell_env->cwd); - else chdir("/"); /* XXX: chdir to getpwent homedir */ + } else { + chdir(shell_env->cwd); + } shell_env->exit_shell = false; for (;;) { + const char *c; + int argc; + char *argv[RTEMS_SHELL_MAXIMUM_ARGUMENTS]; + /* Prompt section */ if (prompt) { rtems_shell_get_prompt(shell_env, prompt, @@ -1044,7 +1115,7 @@ bool rtems_shell_main_loop( /* getcmd section */ cmd = rtems_shell_line_editor(cmds, cmd_count, RTEMS_SHELL_CMD_SIZE, prompt, - stdin, stdout); + stdin, line_editor_output); if (cmd == -1) continue; /* empty line */ @@ -1090,7 +1161,9 @@ bool rtems_shell_main_loop( memcpy (cmd_argv, cmds[cmd], RTEMS_SHELL_CMD_SIZE); if (!rtems_shell_make_args(cmd_argv, &argc, argv, RTEMS_SHELL_MAXIMUM_ARGUMENTS)) { - int exit_code = rtems_shell_execute_cmd(argv[0], argc, argv); + int exit_code; + rtems_shell_winsize(); + exit_code = rtems_shell_execute_cmd(argv[0], argc, argv); if (shell_env->exit_code != NULL) *shell_env->exit_code = exit_code; if (exit_code != 0 && shell_env->exit_on_error) @@ -1107,16 +1180,156 @@ bool rtems_shell_main_loop( } shell_std_debug("end: %d %d\n", result, shell_env->forever); } while (result && shell_env->forever); + } + + free(cmds[0]); + free(cmd_argv); + free(prompt); + + return result; +} + +bool rtems_shell_run_main_loop( + rtems_shell_env_t *shell_env, + bool interactive, + FILE *line_editor_output +) +{ + bool result; + if (shell_env->magic != SHELL_MAGIC) { + return false; + } + + if (!rtems_shell_init_user_env()) { + return false; } - if (cmds[0]) - free (cmds[0]); - if (cmd_argv) - free (cmd_argv); - if (prompt) - free (prompt); + if (!rtems_shell_set_shell_env(shell_env)) { + return false; + } + + result = shell_main_loop(shell_env, interactive, line_editor_output); + rtems_shell_clear_shell_env(); + return result; +} + +bool rtems_shell_main_loop( + rtems_shell_env_t *shell_env +) +{ + struct termios term; + struct termios previous_term; + bool result; + bool interactive = true; + FILE *stdinToClose = NULL; + FILE *stdoutToClose = NULL; + FILE *line_editor_output; + + if (shell_env->magic != SHELL_MAGIC) { + rtems_error(0, "invalid shell environment passed to the main loop)"); + return false; + } + + if (!rtems_shell_set_shell_env(shell_env)) + return false; + + if (!rtems_shell_init_user_env()) { + rtems_error(0, "rtems_shell_init_user_env"); + rtems_shell_clear_shell_env(); + return false; + } + + shell_std_debug("env: %p\n", shell_env); + + if (shell_env->output == NULL || strcmp(shell_env->output, "stdout") == 0) { + if (shell_env->parent_stdout != NULL) + stdout = shell_env->parent_stdout; + } + else if (strcmp(shell_env->output, "stderr") == 0) { + if (shell_env->parent_stderr != NULL) + stdout = shell_env->parent_stderr; + else + stdout = stderr; + } else if (strcmp(shell_env->output, "/dev/null") == 0) { + if (stdout == NULL) { + fprintf(stderr, "shell: stdout is NULLs\n"); + rtems_shell_clear_shell_env(); + return false; + } + fclose (stdout); + } else { + FILE *output = fopen(shell_env->output, + shell_env->output_append ? "a" : "w"); + if (output == NULL) { + fprintf(stderr, "shell: open output %s failed: %s\n", + shell_env->output, strerror(errno)); + rtems_shell_clear_shell_env(); + return false; + } + stdout = output; + stdoutToClose = output; + } + + if (shell_env->input == NULL || strcmp(shell_env->input, "stdin") == 0) { + if (shell_env->parent_stdin != NULL) + stdin = shell_env->parent_stdin; + } else { + FILE *input = fopen(shell_env->input, "r"); + if (input == NULL) { + fprintf(stderr, "shell: open input %s failed: %s\n", + shell_env->input, strerror(errno)); + if (stdoutToClose != NULL) + fclose(stdoutToClose); + rtems_shell_clear_shell_env(); + return false; + } + stdin = input; + stdinToClose = input; + shell_env->forever = false; + interactive = false; + } + + if (interactive) { + if (stdin == NULL) { + fprintf(stderr, "shell: stdin is NULLs\n"); + if (stdoutToClose != NULL) + fclose(stdoutToClose); + rtems_shell_clear_shell_env(); + return false; + } + /* Make a raw terminal, Linux Manuals */ + if (tcgetattr(fileno(stdin), &previous_term) >= 0) { + term = previous_term; + term.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); + term.c_oflag &= ~OPOST; + term.c_oflag |= (OPOST|ONLCR); /* But with cr+nl on output */ + term.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); + term.c_cflag |= CLOCAL | CREAD; + term.c_cc[VMIN] = 1; + term.c_cc[VTIME] = 0; + if (tcsetattr (fileno(stdin), TCSADRAIN, &term) < 0) { + fprintf(stderr, + "shell: cannot set terminal attributes(%s)\n",shell_env->devname); + } + } + } + + shell_std_debug("child out: %d (%p)\n", fileno(stdout), stdout); + shell_std_debug("child in: %d (%p)\n", fileno(stdin), stdin); + + /* Do not buffer if interactive else leave buffered */ + if (interactive) + setvbuf(stdin, NULL, _IONBF, 0); + setvbuf(stdout, NULL, _IONBF, 0); + + if (isatty(fileno(stdin))) { + line_editor_output = stdout; + } else { + line_editor_output = NULL; + } + result = shell_main_loop(shell_env, interactive, line_editor_output); shell_std_debug("child in-to-close: %p\n", stdinToClose); shell_std_debug("child out-to-close: %p\n", stdoutToClose); @@ -1149,7 +1362,6 @@ static rtems_status_code rtems_shell_run ( const char *output, bool output_append, rtems_id wake_on_end, - int *exit_code, bool echo, rtems_shell_login_check_t login_check ) @@ -1165,7 +1377,7 @@ static rtems_status_code rtems_shell_run ( name = rtems_build_name( task_name[0], task_name[1], task_name[2], task_name[3]); else - name = rtems_build_name( 'S', 'E', 'N', 'V' ); + name = SHELL_MAGIC; sc = rtems_task_create( name, @@ -1202,7 +1414,6 @@ static rtems_status_code rtems_shell_run ( shell_env->parent_stdout = stdout; shell_env->parent_stderr = stderr; shell_env->wake_on_end = wake_on_end; - shell_env->exit_code = exit_code; shell_env->login_check = login_check; shell_env->uid = getuid(); shell_env->gid = getgid(); @@ -1229,7 +1440,7 @@ static rtems_status_code rtems_shell_run ( sc = rtems_event_receive (RTEMS_EVENT_1, RTEMS_WAIT, 0, &out); } - shell_std_debug("run: end: sc:%d ec:%d\n", sc, *exit_code); + shell_std_debug("run: end: sc:%d\n", sc); return sc; } @@ -1245,7 +1456,6 @@ rtems_status_code rtems_shell_init( ) { rtems_id to_wake = RTEMS_ID_NONE; - int exit_code = 0; if ( wait ) to_wake = rtems_task_self(); @@ -1261,7 +1471,6 @@ rtems_status_code rtems_shell_init( "stdout", /* output */ false, /* output_append */ to_wake, /* wake_on_end */ - &exit_code, /* exit code of command */ false, /* echo */ login_check /* login check */ ); @@ -1279,7 +1488,6 @@ rtems_status_code rtems_shell_script ( ) { rtems_id to_wake = RTEMS_ID_NONE; - int exit_code = 0; rtems_status_code sc; shell_std_debug("script: in: %s out: %s\n", input, output); @@ -1298,7 +1506,6 @@ rtems_status_code rtems_shell_script ( output, /* output */ output_append, /* output_append */ to_wake, /* wake_on_end */ - &exit_code, /* exit_code */ echo, /* echo */ NULL /* login check */ ); diff --git a/cpukit/libmisc/shell/shell_cmdset.c b/cpukit/libmisc/shell/shell_cmdset.c index 95f180bbb5..89a6aeb32b 100644 --- a/cpukit/libmisc/shell/shell_cmdset.c +++ b/cpukit/libmisc/shell/shell_cmdset.c @@ -1,10 +1,11 @@ +/** + * @file + * + * @brief Shell Command Set Management + */ + /* - * - * Shell Command Set Management - * - * Author: - * WORK: fernando.ruiz@ctv.es - * HOME: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/write_file.c b/cpukit/libmisc/shell/write_file.c index cc57f4c2c2..1cceb0c6ea 100644 --- a/cpukit/libmisc/shell/write_file.c +++ b/cpukit/libmisc/shell/write_file.c @@ -1,11 +1,11 @@ +/** + * @file + * + * @brief Write buffer to a file + */ + /* - * - * Write buffer to a file - * - * Author: - * - * WORK: fernando.ruiz@ctv.es - * HOME: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/stackchk/check.c b/cpukit/libmisc/stackchk/check.c index a2b63345d9..53b96f462c 100644 --- a/cpukit/libmisc/stackchk/check.c +++ b/cpukit/libmisc/stackchk/check.c @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /** * @file * @@ -15,9 +17,26 @@ * COPYRIGHT (c) 1989-2010. * On-Line Applications Research Corporation (OAR). * - * 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. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. * */ @@ -394,129 +413,166 @@ static inline void *Stack_check_Find_high_water_mark( return (void *) base; #endif - return (void *)0; + return NULL; } -static bool Stack_check_Dump_stack_usage( - const Stack_Control *stack, - const void *current, - const char *name, - uint32_t id, - const rtems_printer *printer +static void Stack_check_Visit_stack( + const Stack_Control *stack, + const void *current, + const char *name, + rtems_id id, + rtems_stack_checker_visitor visit, + void *arg ) { - uint32_t size; - uint32_t used; - void *low; - void *high_water_mark; + rtems_stack_checker_info info; - low = Stack_check_Usable_stack_start(stack); - size = Stack_check_Usable_stack_size(stack); + /* This is likely to occur if the stack checker is not actually enabled */ + if ( stack->area == NULL ) { + return; + } - high_water_mark = Stack_check_Find_high_water_mark(low, size); + info.id = id; + info.name = name; + info.current = current; + info.begin = Stack_check_Usable_stack_start( stack ); + info.size = Stack_check_Usable_stack_size( stack ); - if ( high_water_mark ) - used = Stack_check_Calculate_used( low, size, high_water_mark ); - else - used = 0; + if ( Stack_check_Initialized ) { + void *high_water_mark; - rtems_printf( - printer, - "0x%08" PRIx32 " %-21s 0x%08" PRIxPTR " 0x%08" PRIxPTR " 0x%08" PRIxPTR " %6" PRId32 " ", - id, - name, - (uintptr_t) stack->area, - (uintptr_t) stack->area + (uintptr_t) stack->size - 1, - (uintptr_t) current, - size - ); + high_water_mark = + Stack_check_Find_high_water_mark( info.begin, info.size ); - if (Stack_check_Initialized) { - rtems_printf( printer, "%6" PRId32 "\n", used ); + if ( high_water_mark != NULL ) { + info.used = + Stack_check_Calculate_used( info.begin, info.size, high_water_mark ); + } else { + info.used = 0; + } } else { - rtems_printf( printer, "N/A\n" ); + info.used = UINTPTR_MAX; } - return false; + ( *visit )( &info, arg ); } -static bool Stack_check_Dump_threads_usage( +typedef struct { + rtems_stack_checker_visitor visit; + void *arg; +} Stack_check_Visitor; + +static bool Stack_check_Visit_thread( Thread_Control *the_thread, void *arg ) { + Stack_check_Visitor *visitor; char name[ 22 ]; - const rtems_printer *printer; uintptr_t sp = _CPU_Context_Get_SP( &the_thread->Registers ); - printer = arg; + visitor = arg; _Thread_Get_name( the_thread, name, sizeof( name ) ); - Stack_check_Dump_stack_usage( + Stack_check_Visit_stack( &the_thread->Start.Initial_stack, (void *) sp, name, the_thread->Object.id, - printer + visitor->visit, + visitor->arg ); return false; } -static void Stack_check_Dump_interrupt_stack_usage( - const Stack_Control *stack, - uint32_t id, - const rtems_printer *printer +static void Stack_check_Visit_interrupt_stack( + const Stack_Control *stack, + uint32_t id, + rtems_stack_checker_visitor visit, + void *arg ) { - Stack_check_Dump_stack_usage( + Stack_check_Visit_stack( stack, NULL, "Interrupt Stack", id, - printer + visit, + arg ); } -/* - * rtems_stack_checker_report_usage - */ +static void Stack_check_Print_info( + const rtems_stack_checker_info *info, + void *arg +) +{ + const rtems_printer *printer; + + printer = arg; + + rtems_printf( + printer, + "0x%08" PRIx32 " %-21s 0x%08" PRIxPTR " 0x%08" PRIxPTR " 0x%08" PRIxPTR " %6" PRIuPTR " ", + info->id, + info->name, + (uintptr_t) info->begin, + (uintptr_t) info->begin + info->size - 1, + (uintptr_t) info->current, + info->size + ); + + if ( info->used != UINTPTR_MAX ) { + rtems_printf( printer, "%6" PRIuPTR "\n", info->used ); + } else { + rtems_printf( printer, "N/A\n" ); + } +} void rtems_stack_checker_report_usage_with_plugin( const rtems_printer* printer ) { - uint32_t cpu_max; - uint32_t cpu_index; - rtems_printf( printer, " STACK USAGE BY THREAD\n" "ID NAME LOW HIGH CURRENT AVAIL USED\n" ); - /* iterate over all threads and dump the usage */ - rtems_task_iterate( - Stack_check_Dump_threads_usage, + rtems_stack_checker_iterate( + Stack_check_Print_info, RTEMS_DECONST( rtems_printer *, printer ) ); +} + +void rtems_stack_checker_report_usage( void ) +{ + rtems_printer printer; + rtems_print_printer_printk(&printer); + rtems_stack_checker_report_usage_with_plugin( &printer ); +} + +void rtems_stack_checker_iterate( rtems_stack_checker_visitor visit, void *arg ) +{ + Stack_check_Visitor visitor; + uint32_t cpu_max; + uint32_t cpu_index; + + visitor.visit = visit; + visitor.arg = arg; + rtems_task_iterate( Stack_check_Visit_thread, &visitor ); cpu_max = rtems_scheduler_get_processor_maximum(); for ( cpu_index = 0; cpu_index < cpu_max; ++cpu_index ) { - Stack_check_Dump_interrupt_stack_usage( + Stack_check_Visit_interrupt_stack( &Stack_check_Interrupt_stack[ cpu_index ], cpu_index, - printer + visit, + arg ); } } -void rtems_stack_checker_report_usage( void ) -{ - rtems_printer printer; - rtems_print_printer_printk(&printer); - rtems_stack_checker_report_usage_with_plugin( &printer ); -} - static void Stack_check_Prepare_interrupt_stacks( void ) { Stack_Control stack; diff --git a/cpukit/libmisc/untar/untar.c b/cpukit/libmisc/untar/untar.c index a2f09fb99f..fff737db68 100644 --- a/cpukit/libmisc/untar/untar.c +++ b/cpukit/libmisc/untar/untar.c @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /** * @file * @@ -11,9 +13,26 @@ * * Copyright 2016 Chris Johns <chrisj@rtems.org> * - * 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. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H @@ -65,6 +84,14 @@ #define MAX_NAME_FIELD_SIZE 99 +#define TAR_BLOCK_SIZE 512 +#define TAR_BLOCK_SIZE_MASK (TAR_BLOCK_SIZE - 1) + +/* + * Number of blocks read or written + */ +#define TAR_WORK_BLOCKS 16 + static int _rtems_tar_header_checksum(const char *bufr); /* @@ -126,30 +153,25 @@ Make_Path(const rtems_printer *printer, char *path) *p = '\0'; if (p[1] == '\0') { - /* Speculatively unlink the last component so that it can be re-created */ - unlink(path); return 0; } if (mkdir(path, S_IRWXU | S_IRWXG | S_IRWXO) != 0) { - if (errno == EEXIST || errno == EISDIR) { + if (errno == EEXIST) { + /* If it exists already: Check whether it is a directory */ struct stat sb; - - if (stat(path, &sb) != 0) { + if (lstat(path, &sb) != 0) { + Print_Error(printer, "lstat", path); + return -1; + } else if (!S_ISDIR(sb.st_mode)) { + rtems_printf(printer, + "untar: mkdir: %s: exists but is not a directory\n", + path); return -1; } - - if (!S_ISDIR(sb.st_mode)) { - if (unlink(path) != 0) { - Print_Error(printer, "unlink", path); - return -1; - } - - if (mkdir(path, S_IRWXU | S_IRWXG | S_IRWXO) != 0) { - Print_Error(printer, "mkdir (unlink)", path); - return -1; - } - } + } else { + Print_Error(printer, "mkdir", path); + return -1; } } @@ -206,6 +228,12 @@ Untar_ProcessHeader( if (Make_Path(ctx->printer, ctx->file_path) != 0) { retval = UNTAR_FAIL; + } else { + /* + * Speculatively unlink. This should unlink everything but non-empty + * directories or write protected stuff. + */ + unlink(ctx->file_path); } if (ctx->linkflag == SYMTYPE) { @@ -220,13 +248,28 @@ Untar_ProcessHeader( } else if (ctx->linkflag == REGTYPE) { rtems_printf(ctx->printer, "untar: file: %s (s:%lu,m:%04lo)\n", ctx->file_path, ctx->file_size, ctx->mode); - ctx->nblocks = (((ctx->file_size) + 511) & ~511) / 512; + ctx->nblocks = + (((ctx->file_size) + TAR_BLOCK_SIZE_MASK) & ~TAR_BLOCK_SIZE_MASK) / TAR_BLOCK_SIZE; } else if (ctx->linkflag == DIRTYPE) { rtems_printf(ctx->printer, "untar: dir: %s\n", ctx->file_path); r = mkdir(ctx->file_path, ctx->mode); if (r != 0) { - Print_Error(ctx->printer, "mkdir", ctx->file_path); - retval = UNTAR_FAIL; + if (errno == EEXIST) { + /* If it exists already: Check whether it is a directory */ + struct stat sb; + if (lstat(ctx->file_path, &sb) != 0) { + Print_Error(ctx->printer, "lstat", ctx->file_path); + retval = UNTAR_FAIL; + } else if (!S_ISDIR(sb.st_mode)) { + rtems_printf(ctx->printer, + "untar: mkdir: %s: exists but is not a directory\n", + ctx->file_path); + retval = UNTAR_FAIL; + } + } else { + Print_Error(ctx->printer, "mkdir", ctx->file_path); + retval = UNTAR_FAIL; + } } } @@ -277,14 +320,14 @@ Untar_FromMemory_Print( ptr = 0; while (true) { - if (ptr + 512 > size) { + if (ptr + TAR_BLOCK_SIZE > size) { retval = UNTAR_SUCCESSFUL; break; } /* Read the header */ bufr = &tar_ptr[ptr]; - ptr += 512; + ptr += TAR_BLOCK_SIZE; retval = Untar_ProcessHeader(&ctx, bufr); @@ -295,27 +338,26 @@ Untar_FromMemory_Print( if ((fd = open(ctx.file_path, O_TRUNC | O_CREAT | O_WRONLY, ctx.mode)) == -1) { Print_Error(printer, "open", ctx.file_path); - ptr += 512 * ctx.nblocks; + ptr += TAR_BLOCK_SIZE * ctx.nblocks; } else { - unsigned long sizeToGo = ctx.file_size; - ssize_t len; - ssize_t i; - ssize_t n; - /* * Read out the data. There are nblocks of data where nblocks is the * file_size rounded to the nearest 512-byte boundary. */ - for (i = 0; i < ctx.nblocks; i++) { - len = ((sizeToGo < 512L) ? (sizeToGo) : (512L)); - n = write(fd, &tar_ptr[ptr], len); + ssize_t file_size = ctx.file_size; + size_t blocks = ctx.nblocks; + while (blocks > 0) { + size_t blks = blocks > TAR_WORK_BLOCKS ? TAR_WORK_BLOCKS : blocks; + ssize_t len = MIN(blks * TAR_BLOCK_SIZE, file_size); + ssize_t n = write(fd, &tar_ptr[ptr], len); if (n != len) { Print_Error(printer, "write", ctx.file_path); retval = UNTAR_FAIL; break; } - ptr += 512; - sizeToGo -= n; + ptr += blks * TAR_BLOCK_SIZE; + file_size -= n; + blocks -= blks; } close(fd); } @@ -385,7 +427,6 @@ Untar_FromFile_Print( char *bufr; ssize_t n; int retval; - unsigned long i; char buf[UNTAR_FILE_NAME_SIZE]; Untar_HeaderContext ctx; @@ -395,7 +436,7 @@ Untar_FromFile_Print( return UNTAR_FAIL; } - bufr = (char *)malloc(512); + bufr = (char *)malloc(TAR_WORK_BLOCKS * TAR_BLOCK_SIZE); if (bufr == NULL) { close(fd); return(UNTAR_FAIL); @@ -408,7 +449,7 @@ Untar_FromFile_Print( while (1) { /* Read the header */ /* If the header read fails, we just consider it the end of the tarfile. */ - if ((n = read(fd, bufr, 512)) != 512) { + if ((n = read(fd, bufr, TAR_BLOCK_SIZE)) != TAR_BLOCK_SIZE) { break; } @@ -426,12 +467,20 @@ Untar_FromFile_Print( */ if ((out_fd = creat(ctx.file_path, ctx.mode)) == -1) { - (void) lseek(fd, SEEK_CUR, 512UL * ctx.nblocks); + /* Couldn't create that file. Abort. */ + retval = UNTAR_FAIL; + break; } else { - for (i = 0; i < ctx.nblocks; i++) { - n = read(fd, bufr, 512); - n = MIN(n, ctx.file_size - (i * 512UL)); + ssize_t file_size = ctx.file_size; + size_t blocks = ctx.nblocks; + while (blocks > 0) { + size_t blks = blocks > TAR_WORK_BLOCKS ? TAR_WORK_BLOCKS : blocks; + size_t bytes = blks * TAR_BLOCK_SIZE; + n = read(fd, bufr, bytes); + n = MIN(n, file_size); (void) write(out_fd, bufr, n); + file_size -= n; + blocks -= blks; } close(out_fd); } diff --git a/cpukit/libmisc/untar/untar_tgz.c b/cpukit/libmisc/untar/untar_tgz.c index 2afcc7f92e..d2612fd566 100644 --- a/cpukit/libmisc/untar/untar_tgz.c +++ b/cpukit/libmisc/untar/untar_tgz.c @@ -1,15 +1,28 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /* - * Copyright (c) 2016 embedded brains GmbH. All rights reserved. + * Copyright (c) 2016 embedded brains GmbH & Co. KG * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <info@embedded-brains.de> + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * - * 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 SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/untar/untar_txz.c b/cpukit/libmisc/untar/untar_txz.c index 0b0594c12e..62c2dd9c7c 100644 --- a/cpukit/libmisc/untar/untar_txz.c +++ b/cpukit/libmisc/untar/untar_txz.c @@ -1,9 +1,28 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /* * Copyright (c) 2016 Chris Johns <chrisj.rtems.org>. All rights reserved. * - * 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. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/uuid/gen_uuid.c b/cpukit/libmisc/uuid/gen_uuid.c index 71b8a569bb..5601c887c9 100644 --- a/cpukit/libmisc/uuid/gen_uuid.c +++ b/cpukit/libmisc/uuid/gen_uuid.c @@ -171,7 +171,12 @@ static int get_random_fd(void) fcntl(fd, F_SETFD, i | FD_CLOEXEC); } #endif +#ifdef __rtems__ + srand((((time_t)getpid()) << ((sizeof(pid_t)*CHAR_BIT)>>1)) ^ getuid() + ^ tv.tv_sec ^ tv.tv_usec); +#else srand((getpid() << ((sizeof(pid_t)*CHAR_BIT)>>1)) ^ getuid() ^ tv.tv_sec ^ tv.tv_usec); +#endif #ifdef DO_JRAND_MIX jrand_seed[0] = getpid() ^ (tv.tv_sec & 0xFFFF); jrand_seed[1] = getppid() ^ (tv.tv_usec & 0xFFFF); @@ -343,11 +348,17 @@ static int get_clock(uint32_t *clock_high, uint32_t *clock_low, state_fd = open("/var/lib/libuuid/clock.txt", O_RDWR|O_CREAT, 0660); (void) umask(save_umask); +#ifdef __rtems__ + if (state_fd >= 0) { +#endif state_f = fdopen(state_fd, "r+"); if (!state_f) { close(state_fd); state_fd = -1; } +#ifdef __rtems__ + } +#endif } fl.l_type = F_WRLCK; fl.l_whence = SEEK_SET; diff --git a/cpukit/libmisc/xz/COPYING b/cpukit/libmisc/xz/COPYING deleted file mode 100644 index fc4fbf798d..0000000000 --- a/cpukit/libmisc/xz/COPYING +++ /dev/null @@ -1,10 +0,0 @@ - -Licensing of XZ Embedded -======================== - - All the files in this package have been written by Lasse Collin - and/or Igor Pavlov. All these files have been put into the - public domain. You can do whatever you want with these files. - - As usual, this software is provided "as is", without any warranty. - diff --git a/cpukit/libmisc/xz/README b/cpukit/libmisc/xz/README deleted file mode 100644 index 1d5b9d85b2..0000000000 --- a/cpukit/libmisc/xz/README +++ /dev/null @@ -1,10 +0,0 @@ -XZ Emebdded - -Chris Johns <chrisj@rtems.org> 2016 - -The code is take from the git repo: - - https://git.tukaani.org/?p=xz-embedded.git;a=summary - -The source has been pulled out of the Linux structure held in the repo. - diff --git a/cpukit/libmisc/xz/xz_config.h b/cpukit/libmisc/xz/xz_config.h deleted file mode 100644 index eb9dac1a4b..0000000000 --- a/cpukit/libmisc/xz/xz_config.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Private includes and definitions for userspace use of XZ Embedded - * - * Author: Lasse Collin <lasse.collin@tukaani.org> - * - * This file has been put into the public domain. - * You can do whatever you want with this file. - */ - -#ifndef XZ_CONFIG_H -#define XZ_CONFIG_H - -/* Uncomment to enable CRC64 support. */ -/* #define XZ_USE_CRC64 */ - -/* Uncomment as needed to enable BCJ filter decoders. */ -/* #define XZ_DEC_X86 */ -/* #define XZ_DEC_POWERPC */ -/* #define XZ_DEC_IA64 */ -/* #define XZ_DEC_ARM */ -/* #define XZ_DEC_ARMTHUMB */ -/* #define XZ_DEC_SPARC */ - -/* - * MSVC doesn't support modern C but XZ Embedded is mostly C89 - * so these are enough. - */ -#ifdef _MSC_VER -typedef unsigned char bool; -# define true 1 -# define false 0 -# define inline __inline -#else -# include <stdbool.h> -#endif - -#include <stdlib.h> -#include <string.h> - -#include "xz.h" - -#define kmalloc(size, flags) malloc(size) -#define kfree(ptr) free(ptr) -#define vmalloc(size) malloc(size) -#define vfree(ptr) free(ptr) - -#define memeq(a, b, size) (memcmp(a, b, size) == 0) -#define memzero(buf, size) memset(buf, 0, size) - -#ifndef min -# define min(x, y) ((x) < (y) ? (x) : (y)) -#endif -#define min_t(type, x, y) min(x, y) - -/* - * Some functions have been marked with __always_inline to keep the - * performance reasonable even when the compiler is optimizing for - * small code size. You may be able to save a few bytes by #defining - * __always_inline to plain inline, but don't complain if the code - * becomes slow. - * - * NOTE: System headers on GNU/Linux may #define this macro already, - * so if you want to change it, you need to #undef it first. - */ -#ifndef __always_inline -# ifdef __GNUC__ -# define __always_inline \ - inline __attribute__((__always_inline__)) -# else -# define __always_inline inline -# endif -#endif - -/* Inline functions to access unaligned unsigned 32-bit integers */ -#ifndef get_unaligned_le32 -static inline uint32_t get_unaligned_le32(const uint8_t *buf) -{ - return (uint32_t)buf[0] - | ((uint32_t)buf[1] << 8) - | ((uint32_t)buf[2] << 16) - | ((uint32_t)buf[3] << 24); -} -#endif - -#ifndef get_unaligned_be32 -static inline uint32_t get_unaligned_be32(const uint8_t *buf) -{ - return (uint32_t)(buf[0] << 24) - | ((uint32_t)buf[1] << 16) - | ((uint32_t)buf[2] << 8) - | (uint32_t)buf[3]; -} -#endif - -#ifndef put_unaligned_le32 -static inline void put_unaligned_le32(uint32_t val, uint8_t *buf) -{ - buf[0] = (uint8_t)val; - buf[1] = (uint8_t)(val >> 8); - buf[2] = (uint8_t)(val >> 16); - buf[3] = (uint8_t)(val >> 24); -} -#endif - -#ifndef put_unaligned_be32 -static inline void put_unaligned_be32(uint32_t val, uint8_t *buf) -{ - buf[0] = (uint8_t)(val >> 24); - buf[1] = (uint8_t)(val >> 16); - buf[2] = (uint8_t)(val >> 8); - buf[3] = (uint8_t)val; -} -#endif - -/* - * Use get_unaligned_le32() also for aligned access for simplicity. On - * little endian systems, #define get_le32(ptr) (*(const uint32_t *)(ptr)) - * could save a few bytes in code size. - */ -#ifndef get_le32 -# define get_le32 get_unaligned_le32 -#endif - -#endif diff --git a/cpukit/libmisc/xz/xz_crc32.c b/cpukit/libmisc/xz/xz_crc32.c deleted file mode 100644 index 34532d14fd..0000000000 --- a/cpukit/libmisc/xz/xz_crc32.c +++ /dev/null @@ -1,59 +0,0 @@ -/* - * CRC32 using the polynomial from IEEE-802.3 - * - * Authors: Lasse Collin <lasse.collin@tukaani.org> - * Igor Pavlov <http://7-zip.org/> - * - * This file has been put into the public domain. - * You can do whatever you want with this file. - */ - -/* - * This is not the fastest implementation, but it is pretty compact. - * The fastest versions of xz_crc32() on modern CPUs without hardware - * accelerated CRC instruction are 3-5 times as fast as this version, - * but they are bigger and use more memory for the lookup table. - */ - -#include "xz_private.h" - -/* - * STATIC_RW_DATA is used in the pre-boot environment on some architectures. - * See <linux/decompress/mm.h> for details. - */ -#ifndef STATIC_RW_DATA -# define STATIC_RW_DATA static -#endif - -STATIC_RW_DATA uint32_t xz_crc32_table[256]; - -XZ_EXTERN void xz_crc32_init(void) -{ - const uint32_t poly = 0xEDB88320; - - uint32_t i; - uint32_t j; - uint32_t r; - - for (i = 0; i < 256; ++i) { - r = i; - for (j = 0; j < 8; ++j) - r = (r >> 1) ^ (poly & ~((r & 1) - 1)); - - xz_crc32_table[i] = r; - } - - return; -} - -XZ_EXTERN uint32_t xz_crc32(const uint8_t *buf, size_t size, uint32_t crc) -{ - crc = ~crc; - - while (size != 0) { - crc = xz_crc32_table[*buf++ ^ (crc & 0xFF)] ^ (crc >> 8); - --size; - } - - return ~crc; -} diff --git a/cpukit/libmisc/xz/xz_crc64.c b/cpukit/libmisc/xz/xz_crc64.c deleted file mode 100644 index ca1caee899..0000000000 --- a/cpukit/libmisc/xz/xz_crc64.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * CRC64 using the polynomial from ECMA-182 - * - * This file is similar to xz_crc32.c. See the comments there. - * - * Authors: Lasse Collin <lasse.collin@tukaani.org> - * Igor Pavlov <http://7-zip.org/> - * - * This file has been put into the public domain. - * You can do whatever you want with this file. - */ - -#include "xz_private.h" - -#ifndef STATIC_RW_DATA -# define STATIC_RW_DATA static -#endif - -STATIC_RW_DATA uint64_t xz_crc64_table[256]; - -XZ_EXTERN void xz_crc64_init(void) -{ - const uint64_t poly = 0xC96C5795D7870F42; - - uint32_t i; - uint32_t j; - uint64_t r; - - for (i = 0; i < 256; ++i) { - r = i; - for (j = 0; j < 8; ++j) - r = (r >> 1) ^ (poly & ~((r & 1) - 1)); - - xz_crc64_table[i] = r; - } - - return; -} - -XZ_EXTERN uint64_t xz_crc64(const uint8_t *buf, size_t size, uint64_t crc) -{ - crc = ~crc; - - while (size != 0) { - crc = xz_crc64_table[*buf++ ^ (crc & 0xFF)] ^ (crc >> 8); - --size; - } - - return ~crc; -} diff --git a/cpukit/libmisc/xz/xz_dec_lzma2.c b/cpukit/libmisc/xz/xz_dec_lzma2.c deleted file mode 100644 index 6de808c5b3..0000000000 --- a/cpukit/libmisc/xz/xz_dec_lzma2.c +++ /dev/null @@ -1,1182 +0,0 @@ -/* - * LZMA2 decoder - * - * Authors: Lasse Collin <lasse.collin@tukaani.org> - * Igor Pavlov <http://7-zip.org/> - * - * This file has been put into the public domain. - * You can do whatever you want with this file. - */ - -#include "xz_private.h" -#include "xz_lzma2.h" - -/* - * Range decoder initialization eats the first five bytes of each LZMA chunk. - */ -#define RC_INIT_BYTES 5 - -/* - * Minimum number of usable input buffer to safely decode one LZMA symbol. - * The worst case is that we decode 22 bits using probabilities and 26 - * direct bits. This may decode at maximum of 20 bytes of input. However, - * lzma_main() does an extra normalization before returning, thus we - * need to put 21 here. - */ -#define LZMA_IN_REQUIRED 21 - -/* - * Dictionary (history buffer) - * - * These are always true: - * start <= pos <= full <= end - * pos <= limit <= end - * - * In multi-call mode, also these are true: - * end == size - * size <= size_max - * allocated <= size - * - * Most of these variables are size_t to support single-call mode, - * in which the dictionary variables address the actual output - * buffer directly. - */ -struct dictionary { - /* Beginning of the history buffer */ - uint8_t *buf; - - /* Old position in buf (before decoding more data) */ - size_t start; - - /* Position in buf */ - size_t pos; - - /* - * How full dictionary is. This is used to detect corrupt input that - * would read beyond the beginning of the uncompressed stream. - */ - size_t full; - - /* Write limit; we don't write to buf[limit] or later bytes. */ - size_t limit; - - /* - * End of the dictionary buffer. In multi-call mode, this is - * the same as the dictionary size. In single-call mode, this - * indicates the size of the output buffer. - */ - size_t end; - - /* - * Size of the dictionary as specified in Block Header. This is used - * together with "full" to detect corrupt input that would make us - * read beyond the beginning of the uncompressed stream. - */ - uint32_t size; - - /* - * Maximum allowed dictionary size in multi-call mode. - * This is ignored in single-call mode. - */ - uint32_t size_max; - - /* - * Amount of memory currently allocated for the dictionary. - * This is used only with XZ_DYNALLOC. (With XZ_PREALLOC, - * size_max is always the same as the allocated size.) - */ - uint32_t allocated; - - /* Operation mode */ - enum xz_mode mode; -}; - -/* Range decoder */ -struct rc_dec { - uint32_t range; - uint32_t code; - - /* - * Number of initializing bytes remaining to be read - * by rc_read_init(). - */ - uint32_t init_bytes_left; - - /* - * Buffer from which we read our input. It can be either - * temp.buf or the caller-provided input buffer. - */ - const uint8_t *in; - size_t in_pos; - size_t in_limit; -}; - -/* Probabilities for a length decoder. */ -struct lzma_len_dec { - /* Probability of match length being at least 10 */ - uint16_t choice; - - /* Probability of match length being at least 18 */ - uint16_t choice2; - - /* Probabilities for match lengths 2-9 */ - uint16_t low[POS_STATES_MAX][LEN_LOW_SYMBOLS]; - - /* Probabilities for match lengths 10-17 */ - uint16_t mid[POS_STATES_MAX][LEN_MID_SYMBOLS]; - - /* Probabilities for match lengths 18-273 */ - uint16_t high[LEN_HIGH_SYMBOLS]; -}; - -struct lzma_dec { - /* Distances of latest four matches */ - uint32_t rep0; - uint32_t rep1; - uint32_t rep2; - uint32_t rep3; - - /* Types of the most recently seen LZMA symbols */ - enum lzma_state state; - - /* - * Length of a match. This is updated so that dict_repeat can - * be called again to finish repeating the whole match. - */ - uint32_t len; - - /* - * LZMA properties or related bit masks (number of literal - * context bits, a mask dervied from the number of literal - * position bits, and a mask dervied from the number - * position bits) - */ - uint32_t lc; - uint32_t literal_pos_mask; /* (1 << lp) - 1 */ - uint32_t pos_mask; /* (1 << pb) - 1 */ - - /* If 1, it's a match. Otherwise it's a single 8-bit literal. */ - uint16_t is_match[STATES][POS_STATES_MAX]; - - /* If 1, it's a repeated match. The distance is one of rep0 .. rep3. */ - uint16_t is_rep[STATES]; - - /* - * If 0, distance of a repeated match is rep0. - * Otherwise check is_rep1. - */ - uint16_t is_rep0[STATES]; - - /* - * If 0, distance of a repeated match is rep1. - * Otherwise check is_rep2. - */ - uint16_t is_rep1[STATES]; - - /* If 0, distance of a repeated match is rep2. Otherwise it is rep3. */ - uint16_t is_rep2[STATES]; - - /* - * If 1, the repeated match has length of one byte. Otherwise - * the length is decoded from rep_len_decoder. - */ - uint16_t is_rep0_long[STATES][POS_STATES_MAX]; - - /* - * Probability tree for the highest two bits of the match - * distance. There is a separate probability tree for match - * lengths of 2 (i.e. MATCH_LEN_MIN), 3, 4, and [5, 273]. - */ - uint16_t dist_slot[DIST_STATES][DIST_SLOTS]; - - /* - * Probility trees for additional bits for match distance - * when the distance is in the range [4, 127]. - */ - uint16_t dist_special[FULL_DISTANCES - DIST_MODEL_END]; - - /* - * Probability tree for the lowest four bits of a match - * distance that is equal to or greater than 128. - */ - uint16_t dist_align[ALIGN_SIZE]; - - /* Length of a normal match */ - struct lzma_len_dec match_len_dec; - - /* Length of a repeated match */ - struct lzma_len_dec rep_len_dec; - - /* Probabilities of literals */ - uint16_t literal[LITERAL_CODERS_MAX][LITERAL_CODER_SIZE]; -}; - -struct lzma2_dec { - /* Position in xz_dec_lzma2_run(). */ - enum lzma2_seq { - SEQ_CONTROL, - SEQ_UNCOMPRESSED_1, - SEQ_UNCOMPRESSED_2, - SEQ_COMPRESSED_0, - SEQ_COMPRESSED_1, - SEQ_PROPERTIES, - SEQ_LZMA_PREPARE, - SEQ_LZMA_RUN, - SEQ_COPY - } sequence; - - /* Next position after decoding the compressed size of the chunk. */ - enum lzma2_seq next_sequence; - - /* Uncompressed size of LZMA chunk (2 MiB at maximum) */ - uint32_t uncompressed; - - /* - * Compressed size of LZMA chunk or compressed/uncompressed - * size of uncompressed chunk (64 KiB at maximum) - */ - uint32_t compressed; - - /* - * True if dictionary reset is needed. This is false before - * the first chunk (LZMA or uncompressed). - */ - bool need_dict_reset; - - /* - * True if new LZMA properties are needed. This is false - * before the first LZMA chunk. - */ - bool need_props; -}; - -struct xz_dec_lzma2 { - /* - * The order below is important on x86 to reduce code size and - * it shouldn't hurt on other platforms. Everything up to and - * including lzma.pos_mask are in the first 128 bytes on x86-32, - * which allows using smaller instructions to access those - * variables. On x86-64, fewer variables fit into the first 128 - * bytes, but this is still the best order without sacrificing - * the readability by splitting the structures. - */ - struct rc_dec rc; - struct dictionary dict; - struct lzma2_dec lzma2; - struct lzma_dec lzma; - - /* - * Temporary buffer which holds small number of input bytes between - * decoder calls. See lzma2_lzma() for details. - */ - struct { - uint32_t size; - uint8_t buf[3 * LZMA_IN_REQUIRED]; - } temp; -}; - -/************** - * Dictionary * - **************/ - -/* - * Reset the dictionary state. When in single-call mode, set up the beginning - * of the dictionary to point to the actual output buffer. - */ -static void dict_reset(struct dictionary *dict, struct xz_buf *b) -{ - if (DEC_IS_SINGLE(dict->mode)) { - dict->buf = b->out + b->out_pos; - dict->end = b->out_size - b->out_pos; - } - - dict->start = 0; - dict->pos = 0; - dict->limit = 0; - dict->full = 0; -} - -/* Set dictionary write limit */ -static void dict_limit(struct dictionary *dict, size_t out_max) -{ - if (dict->end - dict->pos <= out_max) - dict->limit = dict->end; - else - dict->limit = dict->pos + out_max; -} - -/* Return true if at least one byte can be written into the dictionary. */ -static inline bool dict_has_space(const struct dictionary *dict) -{ - return dict->pos < dict->limit; -} - -/* - * Get a byte from the dictionary at the given distance. The distance is - * assumed to valid, or as a special case, zero when the dictionary is - * still empty. This special case is needed for single-call decoding to - * avoid writing a '\0' to the end of the destination buffer. - */ -static inline uint32_t dict_get(const struct dictionary *dict, uint32_t dist) -{ - size_t offset = dict->pos - dist - 1; - - if (dist >= dict->pos) - offset += dict->end; - - return dict->full > 0 ? dict->buf[offset] : 0; -} - -/* - * Put one byte into the dictionary. It is assumed that there is space for it. - */ -static inline void dict_put(struct dictionary *dict, uint8_t byte) -{ - dict->buf[dict->pos++] = byte; - - if (dict->full < dict->pos) - dict->full = dict->pos; -} - -/* - * Repeat given number of bytes from the given distance. If the distance is - * invalid, false is returned. On success, true is returned and *len is - * updated to indicate how many bytes were left to be repeated. - */ -static bool dict_repeat(struct dictionary *dict, uint32_t *len, uint32_t dist) -{ - size_t back; - uint32_t left; - - if (dist >= dict->full || dist >= dict->size) - return false; - - left = min_t(size_t, dict->limit - dict->pos, *len); - *len -= left; - - back = dict->pos - dist - 1; - if (dist >= dict->pos) - back += dict->end; - - do { - dict->buf[dict->pos++] = dict->buf[back++]; - if (back == dict->end) - back = 0; - } while (--left > 0); - - if (dict->full < dict->pos) - dict->full = dict->pos; - - return true; -} - -/* Copy uncompressed data as is from input to dictionary and output buffers. */ -static void dict_uncompressed(struct dictionary *dict, struct xz_buf *b, - uint32_t *left) -{ - size_t copy_size; - - while (*left > 0 && b->in_pos < b->in_size - && b->out_pos < b->out_size) { - copy_size = min(b->in_size - b->in_pos, - b->out_size - b->out_pos); - if (copy_size > dict->end - dict->pos) - copy_size = dict->end - dict->pos; - if (copy_size > *left) - copy_size = *left; - - *left -= copy_size; - - memcpy(dict->buf + dict->pos, b->in + b->in_pos, copy_size); - dict->pos += copy_size; - - if (dict->full < dict->pos) - dict->full = dict->pos; - - if (DEC_IS_MULTI(dict->mode)) { - if (dict->pos == dict->end) - dict->pos = 0; - - memcpy(b->out + b->out_pos, b->in + b->in_pos, - copy_size); - } - - dict->start = dict->pos; - - b->out_pos += copy_size; - b->in_pos += copy_size; - } -} - -/* - * Flush pending data from dictionary to b->out. It is assumed that there is - * enough space in b->out. This is guaranteed because caller uses dict_limit() - * before decoding data into the dictionary. - */ -static uint32_t dict_flush(struct dictionary *dict, struct xz_buf *b) -{ - size_t copy_size = dict->pos - dict->start; - - if (DEC_IS_MULTI(dict->mode)) { - if (dict->pos == dict->end) - dict->pos = 0; - - memcpy(b->out + b->out_pos, dict->buf + dict->start, - copy_size); - } - - dict->start = dict->pos; - b->out_pos += copy_size; - return copy_size; -} - -/***************** - * Range decoder * - *****************/ - -/* Reset the range decoder. */ -static void rc_reset(struct rc_dec *rc) -{ - rc->range = (uint32_t)-1; - rc->code = 0; - rc->init_bytes_left = RC_INIT_BYTES; -} - -/* - * Read the first five initial bytes into rc->code if they haven't been - * read already. (Yes, the first byte gets completely ignored.) - */ -static bool rc_read_init(struct rc_dec *rc, struct xz_buf *b) -{ - while (rc->init_bytes_left > 0) { - if (b->in_pos == b->in_size) - return false; - - rc->code = (rc->code << 8) + b->in[b->in_pos++]; - --rc->init_bytes_left; - } - - return true; -} - -/* Return true if there may not be enough input for the next decoding loop. */ -static inline bool rc_limit_exceeded(const struct rc_dec *rc) -{ - return rc->in_pos > rc->in_limit; -} - -/* - * Return true if it is possible (from point of view of range decoder) that - * we have reached the end of the LZMA chunk. - */ -static inline bool rc_is_finished(const struct rc_dec *rc) -{ - return rc->code == 0; -} - -#ifdef __rtems__ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wattributes" -#endif /* __rtems__ */ -/* Read the next input byte if needed. */ -static __always_inline void rc_normalize(struct rc_dec *rc) -{ - if (rc->range < RC_TOP_VALUE) { - rc->range <<= RC_SHIFT_BITS; - rc->code = (rc->code << RC_SHIFT_BITS) + rc->in[rc->in_pos++]; - } -} - -/* - * Decode one bit. In some versions, this function has been splitted in three - * functions so that the compiler is supposed to be able to more easily avoid - * an extra branch. In this particular version of the LZMA decoder, this - * doesn't seem to be a good idea (tested with GCC 3.3.6, 3.4.6, and 4.3.3 - * on x86). Using a non-splitted version results in nicer looking code too. - * - * NOTE: This must return an int. Do not make it return a bool or the speed - * of the code generated by GCC 3.x decreases 10-15 %. (GCC 4.3 doesn't care, - * and it generates 10-20 % faster code than GCC 3.x from this file anyway.) - */ -static __always_inline int rc_bit(struct rc_dec *rc, uint16_t *prob) -{ - uint32_t bound; - int bit; - - rc_normalize(rc); - bound = (rc->range >> RC_BIT_MODEL_TOTAL_BITS) * *prob; - if (rc->code < bound) { - rc->range = bound; - *prob += (RC_BIT_MODEL_TOTAL - *prob) >> RC_MOVE_BITS; - bit = 0; - } else { - rc->range -= bound; - rc->code -= bound; - *prob -= *prob >> RC_MOVE_BITS; - bit = 1; - } - - return bit; -} - -/* Decode a bittree starting from the most significant bit. */ -static __always_inline uint32_t rc_bittree(struct rc_dec *rc, - uint16_t *probs, uint32_t limit) -{ - uint32_t symbol = 1; - - do { - if (rc_bit(rc, &probs[symbol])) - symbol = (symbol << 1) + 1; - else - symbol <<= 1; - } while (symbol < limit); - - return symbol; -} - -/* Decode a bittree starting from the least significant bit. */ -static __always_inline void rc_bittree_reverse(struct rc_dec *rc, - uint16_t *probs, - uint32_t *dest, uint32_t limit) -{ - uint32_t symbol = 1; - uint32_t i = 0; - - do { - if (rc_bit(rc, &probs[symbol])) { - symbol = (symbol << 1) + 1; - *dest += 1 << i; - } else { - symbol <<= 1; - } - } while (++i < limit); -} -#ifdef __rtems__ -#pragma GCC diagnostic pop -#endif /* __rtems__ */ - -/* Decode direct bits (fixed fifty-fifty probability) */ -static inline void rc_direct(struct rc_dec *rc, uint32_t *dest, uint32_t limit) -{ - uint32_t mask; - - do { - rc_normalize(rc); - rc->range >>= 1; - rc->code -= rc->range; - mask = (uint32_t)0 - (rc->code >> 31); - rc->code += rc->range & mask; - *dest = (*dest << 1) + (mask + 1); - } while (--limit > 0); -} - -/******** - * LZMA * - ********/ - -/* Get pointer to literal coder probability array. */ -static uint16_t *lzma_literal_probs(struct xz_dec_lzma2 *s) -{ - uint32_t prev_byte = dict_get(&s->dict, 0); - uint32_t low = prev_byte >> (8 - s->lzma.lc); - uint32_t high = (s->dict.pos & s->lzma.literal_pos_mask) << s->lzma.lc; - return s->lzma.literal[low + high]; -} - -/* Decode a literal (one 8-bit byte) */ -static void lzma_literal(struct xz_dec_lzma2 *s) -{ - uint16_t *probs; - uint32_t symbol; - uint32_t match_byte; - uint32_t match_bit; - uint32_t offset; - uint32_t i; - - probs = lzma_literal_probs(s); - - if (lzma_state_is_literal(s->lzma.state)) { - symbol = rc_bittree(&s->rc, probs, 0x100); - } else { - symbol = 1; - match_byte = dict_get(&s->dict, s->lzma.rep0) << 1; - offset = 0x100; - - do { - match_bit = match_byte & offset; - match_byte <<= 1; - i = offset + match_bit + symbol; - - if (rc_bit(&s->rc, &probs[i])) { - symbol = (symbol << 1) + 1; - offset &= match_bit; - } else { - symbol <<= 1; - offset &= ~match_bit; - } - } while (symbol < 0x100); - } - - dict_put(&s->dict, (uint8_t)symbol); - lzma_state_literal(&s->lzma.state); -} - -/* Decode the length of the match into s->lzma.len. */ -static void lzma_len(struct xz_dec_lzma2 *s, struct lzma_len_dec *l, - uint32_t pos_state) -{ - uint16_t *probs; - uint32_t limit; - - if (!rc_bit(&s->rc, &l->choice)) { - probs = l->low[pos_state]; - limit = LEN_LOW_SYMBOLS; - s->lzma.len = MATCH_LEN_MIN; - } else { - if (!rc_bit(&s->rc, &l->choice2)) { - probs = l->mid[pos_state]; - limit = LEN_MID_SYMBOLS; - s->lzma.len = MATCH_LEN_MIN + LEN_LOW_SYMBOLS; - } else { - probs = l->high; - limit = LEN_HIGH_SYMBOLS; - s->lzma.len = MATCH_LEN_MIN + LEN_LOW_SYMBOLS - + LEN_MID_SYMBOLS; - } - } - - s->lzma.len += rc_bittree(&s->rc, probs, limit) - limit; -} - -/* Decode a match. The distance will be stored in s->lzma.rep0. */ -static void lzma_match(struct xz_dec_lzma2 *s, uint32_t pos_state) -{ - uint16_t *probs; - uint32_t dist_slot; - uint32_t limit; - - lzma_state_match(&s->lzma.state); - - s->lzma.rep3 = s->lzma.rep2; - s->lzma.rep2 = s->lzma.rep1; - s->lzma.rep1 = s->lzma.rep0; - - lzma_len(s, &s->lzma.match_len_dec, pos_state); - - probs = s->lzma.dist_slot[lzma_get_dist_state(s->lzma.len)]; - dist_slot = rc_bittree(&s->rc, probs, DIST_SLOTS) - DIST_SLOTS; - - if (dist_slot < DIST_MODEL_START) { - s->lzma.rep0 = dist_slot; - } else { - limit = (dist_slot >> 1) - 1; - s->lzma.rep0 = 2 + (dist_slot & 1); - - if (dist_slot < DIST_MODEL_END) { - s->lzma.rep0 <<= limit; - probs = s->lzma.dist_special + s->lzma.rep0 - - dist_slot - 1; - rc_bittree_reverse(&s->rc, probs, - &s->lzma.rep0, limit); - } else { - rc_direct(&s->rc, &s->lzma.rep0, limit - ALIGN_BITS); - s->lzma.rep0 <<= ALIGN_BITS; - rc_bittree_reverse(&s->rc, s->lzma.dist_align, - &s->lzma.rep0, ALIGN_BITS); - } - } -} - -/* - * Decode a repeated match. The distance is one of the four most recently - * seen matches. The distance will be stored in s->lzma.rep0. - */ -static void lzma_rep_match(struct xz_dec_lzma2 *s, uint32_t pos_state) -{ - uint32_t tmp; - - if (!rc_bit(&s->rc, &s->lzma.is_rep0[s->lzma.state])) { - if (!rc_bit(&s->rc, &s->lzma.is_rep0_long[ - s->lzma.state][pos_state])) { - lzma_state_short_rep(&s->lzma.state); - s->lzma.len = 1; - return; - } - } else { - if (!rc_bit(&s->rc, &s->lzma.is_rep1[s->lzma.state])) { - tmp = s->lzma.rep1; - } else { - if (!rc_bit(&s->rc, &s->lzma.is_rep2[s->lzma.state])) { - tmp = s->lzma.rep2; - } else { - tmp = s->lzma.rep3; - s->lzma.rep3 = s->lzma.rep2; - } - - s->lzma.rep2 = s->lzma.rep1; - } - - s->lzma.rep1 = s->lzma.rep0; - s->lzma.rep0 = tmp; - } - - lzma_state_long_rep(&s->lzma.state); - lzma_len(s, &s->lzma.rep_len_dec, pos_state); -} - -/* LZMA decoder core */ -static bool lzma_main(struct xz_dec_lzma2 *s) -{ - uint32_t pos_state; - - /* - * If the dictionary was reached during the previous call, try to - * finish the possibly pending repeat in the dictionary. - */ - if (dict_has_space(&s->dict) && s->lzma.len > 0) - dict_repeat(&s->dict, &s->lzma.len, s->lzma.rep0); - - /* - * Decode more LZMA symbols. One iteration may consume up to - * LZMA_IN_REQUIRED - 1 bytes. - */ - while (dict_has_space(&s->dict) && !rc_limit_exceeded(&s->rc)) { - pos_state = s->dict.pos & s->lzma.pos_mask; - - if (!rc_bit(&s->rc, &s->lzma.is_match[ - s->lzma.state][pos_state])) { - lzma_literal(s); - } else { - if (rc_bit(&s->rc, &s->lzma.is_rep[s->lzma.state])) - lzma_rep_match(s, pos_state); - else - lzma_match(s, pos_state); - - if (!dict_repeat(&s->dict, &s->lzma.len, s->lzma.rep0)) - return false; - } - } - - /* - * Having the range decoder always normalized when we are outside - * this function makes it easier to correctly handle end of the chunk. - */ - rc_normalize(&s->rc); - - return true; -} - -/* - * Reset the LZMA decoder and range decoder state. Dictionary is nore reset - * here, because LZMA state may be reset without resetting the dictionary. - */ -static void lzma_reset(struct xz_dec_lzma2 *s) -{ - uint16_t *probs; - size_t i; - - s->lzma.state = STATE_LIT_LIT; - s->lzma.rep0 = 0; - s->lzma.rep1 = 0; - s->lzma.rep2 = 0; - s->lzma.rep3 = 0; - - /* - * All probabilities are initialized to the same value. This hack - * makes the code smaller by avoiding a separate loop for each - * probability array. - * - * This could be optimized so that only that part of literal - * probabilities that are actually required. In the common case - * we would write 12 KiB less. - */ - probs = s->lzma.is_match[0]; - for (i = 0; i < PROBS_TOTAL; ++i) - probs[i] = RC_BIT_MODEL_TOTAL / 2; - - rc_reset(&s->rc); -} - -/* - * Decode and validate LZMA properties (lc/lp/pb) and calculate the bit masks - * from the decoded lp and pb values. On success, the LZMA decoder state is - * reset and true is returned. - */ -static bool lzma_props(struct xz_dec_lzma2 *s, uint8_t props) -{ - if (props > (4 * 5 + 4) * 9 + 8) - return false; - - s->lzma.pos_mask = 0; - while (props >= 9 * 5) { - props -= 9 * 5; - ++s->lzma.pos_mask; - } - - s->lzma.pos_mask = (1 << s->lzma.pos_mask) - 1; - - s->lzma.literal_pos_mask = 0; - while (props >= 9) { - props -= 9; - ++s->lzma.literal_pos_mask; - } - - s->lzma.lc = props; - - if (s->lzma.lc + s->lzma.literal_pos_mask > 4) - return false; - - s->lzma.literal_pos_mask = (1 << s->lzma.literal_pos_mask) - 1; - - lzma_reset(s); - - return true; -} - -/********* - * LZMA2 * - *********/ - -/* - * The LZMA decoder assumes that if the input limit (s->rc.in_limit) hasn't - * been exceeded, it is safe to read up to LZMA_IN_REQUIRED bytes. This - * wrapper function takes care of making the LZMA decoder's assumption safe. - * - * As long as there is plenty of input left to be decoded in the current LZMA - * chunk, we decode directly from the caller-supplied input buffer until - * there's LZMA_IN_REQUIRED bytes left. Those remaining bytes are copied into - * s->temp.buf, which (hopefully) gets filled on the next call to this - * function. We decode a few bytes from the temporary buffer so that we can - * continue decoding from the caller-supplied input buffer again. - */ -static bool lzma2_lzma(struct xz_dec_lzma2 *s, struct xz_buf *b) -{ - size_t in_avail; - uint32_t tmp; - - in_avail = b->in_size - b->in_pos; - if (s->temp.size > 0 || s->lzma2.compressed == 0) { - tmp = 2 * LZMA_IN_REQUIRED - s->temp.size; - if (tmp > s->lzma2.compressed - s->temp.size) - tmp = s->lzma2.compressed - s->temp.size; - if (tmp > in_avail) - tmp = in_avail; - - memcpy(s->temp.buf + s->temp.size, b->in + b->in_pos, tmp); - - if (s->temp.size + tmp == s->lzma2.compressed) { - memzero(s->temp.buf + s->temp.size + tmp, - sizeof(s->temp.buf) - - s->temp.size - tmp); - s->rc.in_limit = s->temp.size + tmp; - } else if (s->temp.size + tmp < LZMA_IN_REQUIRED) { - s->temp.size += tmp; - b->in_pos += tmp; - return true; - } else { - s->rc.in_limit = s->temp.size + tmp - LZMA_IN_REQUIRED; - } - - s->rc.in = s->temp.buf; - s->rc.in_pos = 0; - - if (!lzma_main(s) || s->rc.in_pos > s->temp.size + tmp) - return false; - - s->lzma2.compressed -= s->rc.in_pos; - - if (s->rc.in_pos < s->temp.size) { - s->temp.size -= s->rc.in_pos; - memmove(s->temp.buf, s->temp.buf + s->rc.in_pos, - s->temp.size); - return true; - } - - b->in_pos += s->rc.in_pos - s->temp.size; - s->temp.size = 0; - } - - in_avail = b->in_size - b->in_pos; - if (in_avail >= LZMA_IN_REQUIRED) { - s->rc.in = b->in; - s->rc.in_pos = b->in_pos; - - if (in_avail >= s->lzma2.compressed + LZMA_IN_REQUIRED) - s->rc.in_limit = b->in_pos + s->lzma2.compressed; - else - s->rc.in_limit = b->in_size - LZMA_IN_REQUIRED; - - if (!lzma_main(s)) - return false; - - in_avail = s->rc.in_pos - b->in_pos; - if (in_avail > s->lzma2.compressed) - return false; - - s->lzma2.compressed -= in_avail; - b->in_pos = s->rc.in_pos; - } - - in_avail = b->in_size - b->in_pos; - if (in_avail < LZMA_IN_REQUIRED) { - if (in_avail > s->lzma2.compressed) - in_avail = s->lzma2.compressed; - - memcpy(s->temp.buf, b->in + b->in_pos, in_avail); - s->temp.size = in_avail; - b->in_pos += in_avail; - } - - return true; -} - -/* - * Take care of the LZMA2 control layer, and forward the job of actual LZMA - * decoding or copying of uncompressed chunks to other functions. - */ -XZ_EXTERN enum xz_ret xz_dec_lzma2_run(struct xz_dec_lzma2 *s, - struct xz_buf *b) -{ - uint32_t tmp; - - while (b->in_pos < b->in_size || s->lzma2.sequence == SEQ_LZMA_RUN) { - switch (s->lzma2.sequence) { - case SEQ_CONTROL: - /* - * LZMA2 control byte - * - * Exact values: - * 0x00 End marker - * 0x01 Dictionary reset followed by - * an uncompressed chunk - * 0x02 Uncompressed chunk (no dictionary reset) - * - * Highest three bits (s->control & 0xE0): - * 0xE0 Dictionary reset, new properties and state - * reset, followed by LZMA compressed chunk - * 0xC0 New properties and state reset, followed - * by LZMA compressed chunk (no dictionary - * reset) - * 0xA0 State reset using old properties, - * followed by LZMA compressed chunk (no - * dictionary reset) - * 0x80 LZMA chunk (no dictionary or state reset) - * - * For LZMA compressed chunks, the lowest five bits - * (s->control & 1F) are the highest bits of the - * uncompressed size (bits 16-20). - * - * A new LZMA2 stream must begin with a dictionary - * reset. The first LZMA chunk must set new - * properties and reset the LZMA state. - * - * Values that don't match anything described above - * are invalid and we return XZ_DATA_ERROR. - */ - tmp = b->in[b->in_pos++]; - - if (tmp == 0x00) - return XZ_STREAM_END; - - if (tmp >= 0xE0 || tmp == 0x01) { - s->lzma2.need_props = true; - s->lzma2.need_dict_reset = false; - dict_reset(&s->dict, b); - } else if (s->lzma2.need_dict_reset) { - return XZ_DATA_ERROR; - } - - if (tmp >= 0x80) { - s->lzma2.uncompressed = (tmp & 0x1F) << 16; - s->lzma2.sequence = SEQ_UNCOMPRESSED_1; - - if (tmp >= 0xC0) { - /* - * When there are new properties, - * state reset is done at - * SEQ_PROPERTIES. - */ - s->lzma2.need_props = false; - s->lzma2.next_sequence - = SEQ_PROPERTIES; - - } else if (s->lzma2.need_props) { - return XZ_DATA_ERROR; - - } else { - s->lzma2.next_sequence - = SEQ_LZMA_PREPARE; - if (tmp >= 0xA0) - lzma_reset(s); - } - } else { - if (tmp > 0x02) - return XZ_DATA_ERROR; - - s->lzma2.sequence = SEQ_COMPRESSED_0; - s->lzma2.next_sequence = SEQ_COPY; - } - - break; - - case SEQ_UNCOMPRESSED_1: - s->lzma2.uncompressed - += (uint32_t)b->in[b->in_pos++] << 8; - s->lzma2.sequence = SEQ_UNCOMPRESSED_2; - break; - - case SEQ_UNCOMPRESSED_2: - s->lzma2.uncompressed - += (uint32_t)b->in[b->in_pos++] + 1; - s->lzma2.sequence = SEQ_COMPRESSED_0; - break; - - case SEQ_COMPRESSED_0: - s->lzma2.compressed - = (uint32_t)b->in[b->in_pos++] << 8; - s->lzma2.sequence = SEQ_COMPRESSED_1; - break; - - case SEQ_COMPRESSED_1: - s->lzma2.compressed - += (uint32_t)b->in[b->in_pos++] + 1; - s->lzma2.sequence = s->lzma2.next_sequence; - break; - - case SEQ_PROPERTIES: - if (!lzma_props(s, b->in[b->in_pos++])) - return XZ_DATA_ERROR; - - s->lzma2.sequence = SEQ_LZMA_PREPARE; - - /* Fall through */ - - case SEQ_LZMA_PREPARE: - if (s->lzma2.compressed < RC_INIT_BYTES) - return XZ_DATA_ERROR; - - if (!rc_read_init(&s->rc, b)) - return XZ_OK; - - s->lzma2.compressed -= RC_INIT_BYTES; - s->lzma2.sequence = SEQ_LZMA_RUN; - - /* Fall through */ - - case SEQ_LZMA_RUN: - /* - * Set dictionary limit to indicate how much we want - * to be encoded at maximum. Decode new data into the - * dictionary. Flush the new data from dictionary to - * b->out. Check if we finished decoding this chunk. - * In case the dictionary got full but we didn't fill - * the output buffer yet, we may run this loop - * multiple times without changing s->lzma2.sequence. - */ - dict_limit(&s->dict, min_t(size_t, - b->out_size - b->out_pos, - s->lzma2.uncompressed)); - if (!lzma2_lzma(s, b)) - return XZ_DATA_ERROR; - - s->lzma2.uncompressed -= dict_flush(&s->dict, b); - - if (s->lzma2.uncompressed == 0) { - if (s->lzma2.compressed > 0 || s->lzma.len > 0 - || !rc_is_finished(&s->rc)) - return XZ_DATA_ERROR; - - rc_reset(&s->rc); - s->lzma2.sequence = SEQ_CONTROL; - - } else if (b->out_pos == b->out_size - || (b->in_pos == b->in_size - && s->temp.size - < s->lzma2.compressed)) { - return XZ_OK; - } - - break; - - case SEQ_COPY: - dict_uncompressed(&s->dict, b, &s->lzma2.compressed); - if (s->lzma2.compressed > 0) - return XZ_OK; - - s->lzma2.sequence = SEQ_CONTROL; - break; - } - } - - return XZ_OK; -} - -XZ_EXTERN struct xz_dec_lzma2 *xz_dec_lzma2_create(enum xz_mode mode, - uint32_t dict_max) -{ - struct xz_dec_lzma2 *s = kmalloc(sizeof(*s), GFP_KERNEL); - if (s == NULL) - return NULL; - - s->dict.mode = mode; - s->dict.size_max = dict_max; - - if (DEC_IS_PREALLOC(mode)) { - s->dict.buf = vmalloc(dict_max); - if (s->dict.buf == NULL) { - kfree(s); - return NULL; - } - } else if (DEC_IS_DYNALLOC(mode)) { - s->dict.buf = NULL; - s->dict.allocated = 0; - } - - return s; -} - -XZ_EXTERN enum xz_ret xz_dec_lzma2_reset(struct xz_dec_lzma2 *s, uint8_t props) -{ - /* This limits dictionary size to 3 GiB to keep parsing simpler. */ - if (props > 39) - return XZ_OPTIONS_ERROR; - - s->dict.size = 2 + (props & 1); - s->dict.size <<= (props >> 1) + 11; - - if (DEC_IS_MULTI(s->dict.mode)) { - if (s->dict.size > s->dict.size_max) - return XZ_MEMLIMIT_ERROR; - - s->dict.end = s->dict.size; - - if (DEC_IS_DYNALLOC(s->dict.mode)) { - if (s->dict.allocated < s->dict.size) { - vfree(s->dict.buf); - s->dict.buf = vmalloc(s->dict.size); - if (s->dict.buf == NULL) { - s->dict.allocated = 0; - return XZ_MEM_ERROR; - } - } - } - } - - s->lzma.len = 0; - - s->lzma2.sequence = SEQ_CONTROL; - s->lzma2.need_dict_reset = true; - - s->temp.size = 0; - - return XZ_OK; -} - -XZ_EXTERN void xz_dec_lzma2_end(struct xz_dec_lzma2 *s) -{ - if (DEC_IS_MULTI(s->dict.mode)) - vfree(s->dict.buf); - - kfree(s); -} diff --git a/cpukit/libmisc/xz/xz_dec_stream.c b/cpukit/libmisc/xz/xz_dec_stream.c deleted file mode 100644 index d6525506a1..0000000000 --- a/cpukit/libmisc/xz/xz_dec_stream.c +++ /dev/null @@ -1,847 +0,0 @@ -/* - * .xz Stream decoder - * - * Author: Lasse Collin <lasse.collin@tukaani.org> - * - * This file has been put into the public domain. - * You can do whatever you want with this file. - */ - -#include "xz_private.h" -#include "xz_stream.h" - -#ifdef XZ_USE_CRC64 -# define IS_CRC64(check_type) ((check_type) == XZ_CHECK_CRC64) -#else -# define IS_CRC64(check_type) false -#endif - -/* Hash used to validate the Index field */ -struct xz_dec_hash { - vli_type unpadded; - vli_type uncompressed; - uint32_t crc32; -}; - -struct xz_dec { - /* Position in dec_main() */ - enum { - SEQ_STREAM_HEADER, - SEQ_BLOCK_START, - SEQ_BLOCK_HEADER, - SEQ_BLOCK_UNCOMPRESS, - SEQ_BLOCK_PADDING, - SEQ_BLOCK_CHECK, - SEQ_INDEX, - SEQ_INDEX_PADDING, - SEQ_INDEX_CRC32, - SEQ_STREAM_FOOTER - } sequence; - - /* Position in variable-length integers and Check fields */ - uint32_t pos; - - /* Variable-length integer decoded by dec_vli() */ - vli_type vli; - - /* Saved in_pos and out_pos */ - size_t in_start; - size_t out_start; - -#ifdef XZ_USE_CRC64 - /* CRC32 or CRC64 value in Block or CRC32 value in Index */ - uint64_t crc; -#else - /* CRC32 value in Block or Index */ - uint32_t crc; -#endif - - /* Type of the integrity check calculated from uncompressed data */ - enum xz_check check_type; - - /* Operation mode */ - enum xz_mode mode; - - /* - * True if the next call to xz_dec_run() is allowed to return - * XZ_BUF_ERROR. - */ - bool allow_buf_error; - - /* Information stored in Block Header */ - struct { - /* - * Value stored in the Compressed Size field, or - * VLI_UNKNOWN if Compressed Size is not present. - */ - vli_type compressed; - - /* - * Value stored in the Uncompressed Size field, or - * VLI_UNKNOWN if Uncompressed Size is not present. - */ - vli_type uncompressed; - - /* Size of the Block Header field */ - uint32_t size; - } block_header; - - /* Information collected when decoding Blocks */ - struct { - /* Observed compressed size of the current Block */ - vli_type compressed; - - /* Observed uncompressed size of the current Block */ - vli_type uncompressed; - - /* Number of Blocks decoded so far */ - vli_type count; - - /* - * Hash calculated from the Block sizes. This is used to - * validate the Index field. - */ - struct xz_dec_hash hash; - } block; - - /* Variables needed when verifying the Index field */ - struct { - /* Position in dec_index() */ - enum { - SEQ_INDEX_COUNT, - SEQ_INDEX_UNPADDED, - SEQ_INDEX_UNCOMPRESSED - } sequence; - - /* Size of the Index in bytes */ - vli_type size; - - /* Number of Records (matches block.count in valid files) */ - vli_type count; - - /* - * Hash calculated from the Records (matches block.hash in - * valid files). - */ - struct xz_dec_hash hash; - } index; - - /* - * Temporary buffer needed to hold Stream Header, Block Header, - * and Stream Footer. The Block Header is the biggest (1 KiB) - * so we reserve space according to that. buf[] has to be aligned - * to a multiple of four bytes; the size_t variables before it - * should guarantee this. - */ - struct { - size_t pos; - size_t size; - uint8_t buf[1024]; - } temp; - - struct xz_dec_lzma2 *lzma2; - -#ifdef XZ_DEC_BCJ - struct xz_dec_bcj *bcj; - bool bcj_active; -#endif -}; - -#ifdef XZ_DEC_ANY_CHECK -/* Sizes of the Check field with different Check IDs */ -static const uint8_t check_sizes[16] = { - 0, - 4, 4, 4, - 8, 8, 8, - 16, 16, 16, - 32, 32, 32, - 64, 64, 64 -}; -#endif - -/* - * Fill s->temp by copying data starting from b->in[b->in_pos]. Caller - * must have set s->temp.pos to indicate how much data we are supposed - * to copy into s->temp.buf. Return true once s->temp.pos has reached - * s->temp.size. - */ -static bool fill_temp(struct xz_dec *s, struct xz_buf *b) -{ - size_t copy_size = min_t(size_t, - b->in_size - b->in_pos, s->temp.size - s->temp.pos); - - memcpy(s->temp.buf + s->temp.pos, b->in + b->in_pos, copy_size); - b->in_pos += copy_size; - s->temp.pos += copy_size; - - if (s->temp.pos == s->temp.size) { - s->temp.pos = 0; - return true; - } - - return false; -} - -/* Decode a variable-length integer (little-endian base-128 encoding) */ -static enum xz_ret dec_vli(struct xz_dec *s, const uint8_t *in, - size_t *in_pos, size_t in_size) -{ - uint8_t byte; - - if (s->pos == 0) - s->vli = 0; - - while (*in_pos < in_size) { - byte = in[*in_pos]; - ++*in_pos; - - s->vli |= (vli_type)(byte & 0x7F) << s->pos; - - if ((byte & 0x80) == 0) { - /* Don't allow non-minimal encodings. */ - if (byte == 0 && s->pos != 0) - return XZ_DATA_ERROR; - - s->pos = 0; - return XZ_STREAM_END; - } - - s->pos += 7; - if (s->pos == 7 * VLI_BYTES_MAX) - return XZ_DATA_ERROR; - } - - return XZ_OK; -} - -/* - * Decode the Compressed Data field from a Block. Update and validate - * the observed compressed and uncompressed sizes of the Block so that - * they don't exceed the values possibly stored in the Block Header - * (validation assumes that no integer overflow occurs, since vli_type - * is normally uint64_t). Update the CRC32 or CRC64 value if presence of - * the CRC32 or CRC64 field was indicated in Stream Header. - * - * Once the decoding is finished, validate that the observed sizes match - * the sizes possibly stored in the Block Header. Update the hash and - * Block count, which are later used to validate the Index field. - */ -static enum xz_ret dec_block(struct xz_dec *s, struct xz_buf *b) -{ - enum xz_ret ret; - - s->in_start = b->in_pos; - s->out_start = b->out_pos; - -#ifdef XZ_DEC_BCJ - if (s->bcj_active) - ret = xz_dec_bcj_run(s->bcj, s->lzma2, b); - else -#endif - ret = xz_dec_lzma2_run(s->lzma2, b); - - s->block.compressed += b->in_pos - s->in_start; - s->block.uncompressed += b->out_pos - s->out_start; - - /* - * There is no need to separately check for VLI_UNKNOWN, since - * the observed sizes are always smaller than VLI_UNKNOWN. - */ - if (s->block.compressed > s->block_header.compressed - || s->block.uncompressed - > s->block_header.uncompressed) - return XZ_DATA_ERROR; - - if (s->check_type == XZ_CHECK_CRC32) - s->crc = xz_crc32(b->out + s->out_start, - b->out_pos - s->out_start, s->crc); -#ifdef XZ_USE_CRC64 - else if (s->check_type == XZ_CHECK_CRC64) - s->crc = xz_crc64(b->out + s->out_start, - b->out_pos - s->out_start, s->crc); -#endif - - if (ret == XZ_STREAM_END) { - if (s->block_header.compressed != VLI_UNKNOWN - && s->block_header.compressed - != s->block.compressed) - return XZ_DATA_ERROR; - - if (s->block_header.uncompressed != VLI_UNKNOWN - && s->block_header.uncompressed - != s->block.uncompressed) - return XZ_DATA_ERROR; - - s->block.hash.unpadded += s->block_header.size - + s->block.compressed; - -#ifdef XZ_DEC_ANY_CHECK - s->block.hash.unpadded += check_sizes[s->check_type]; -#else - if (s->check_type == XZ_CHECK_CRC32) - s->block.hash.unpadded += 4; - else if (IS_CRC64(s->check_type)) - s->block.hash.unpadded += 8; -#endif - - s->block.hash.uncompressed += s->block.uncompressed; - s->block.hash.crc32 = xz_crc32( - (const uint8_t *)&s->block.hash, - sizeof(s->block.hash), s->block.hash.crc32); - - ++s->block.count; - } - - return ret; -} - -/* Update the Index size and the CRC32 value. */ -static void index_update(struct xz_dec *s, const struct xz_buf *b) -{ - size_t in_used = b->in_pos - s->in_start; - s->index.size += in_used; - s->crc = xz_crc32(b->in + s->in_start, in_used, s->crc); -} - -/* - * Decode the Number of Records, Unpadded Size, and Uncompressed Size - * fields from the Index field. That is, Index Padding and CRC32 are not - * decoded by this function. - * - * This can return XZ_OK (more input needed), XZ_STREAM_END (everything - * successfully decoded), or XZ_DATA_ERROR (input is corrupt). - */ -static enum xz_ret dec_index(struct xz_dec *s, struct xz_buf *b) -{ - enum xz_ret ret; - - do { - ret = dec_vli(s, b->in, &b->in_pos, b->in_size); - if (ret != XZ_STREAM_END) { - index_update(s, b); - return ret; - } - - switch (s->index.sequence) { - case SEQ_INDEX_COUNT: - s->index.count = s->vli; - - /* - * Validate that the Number of Records field - * indicates the same number of Records as - * there were Blocks in the Stream. - */ - if (s->index.count != s->block.count) - return XZ_DATA_ERROR; - - s->index.sequence = SEQ_INDEX_UNPADDED; - break; - - case SEQ_INDEX_UNPADDED: - s->index.hash.unpadded += s->vli; - s->index.sequence = SEQ_INDEX_UNCOMPRESSED; - break; - - case SEQ_INDEX_UNCOMPRESSED: - s->index.hash.uncompressed += s->vli; - s->index.hash.crc32 = xz_crc32( - (const uint8_t *)&s->index.hash, - sizeof(s->index.hash), - s->index.hash.crc32); - --s->index.count; - s->index.sequence = SEQ_INDEX_UNPADDED; - break; - } - } while (s->index.count > 0); - - return XZ_STREAM_END; -} - -/* - * Validate that the next four or eight input bytes match the value - * of s->crc. s->pos must be zero when starting to validate the first byte. - * The "bits" argument allows using the same code for both CRC32 and CRC64. - */ -static enum xz_ret crc_validate(struct xz_dec *s, struct xz_buf *b, - uint32_t bits) -{ - do { - if (b->in_pos == b->in_size) - return XZ_OK; - - if (((s->crc >> s->pos) & 0xFF) != b->in[b->in_pos++]) - return XZ_DATA_ERROR; - - s->pos += 8; - - } while (s->pos < bits); - - s->crc = 0; - s->pos = 0; - - return XZ_STREAM_END; -} - -#ifdef XZ_DEC_ANY_CHECK -/* - * Skip over the Check field when the Check ID is not supported. - * Returns true once the whole Check field has been skipped over. - */ -static bool check_skip(struct xz_dec *s, struct xz_buf *b) -{ - while (s->pos < check_sizes[s->check_type]) { - if (b->in_pos == b->in_size) - return false; - - ++b->in_pos; - ++s->pos; - } - - s->pos = 0; - - return true; -} -#endif - -/* Decode the Stream Header field (the first 12 bytes of the .xz Stream). */ -static enum xz_ret dec_stream_header(struct xz_dec *s) -{ - if (!memeq(s->temp.buf, HEADER_MAGIC, HEADER_MAGIC_SIZE)) - return XZ_FORMAT_ERROR; - - if (xz_crc32(s->temp.buf + HEADER_MAGIC_SIZE, 2, 0) - != get_le32(s->temp.buf + HEADER_MAGIC_SIZE + 2)) - return XZ_DATA_ERROR; - - if (s->temp.buf[HEADER_MAGIC_SIZE] != 0) - return XZ_OPTIONS_ERROR; - - /* - * Of integrity checks, we support none (Check ID = 0), - * CRC32 (Check ID = 1), and optionally CRC64 (Check ID = 4). - * However, if XZ_DEC_ANY_CHECK is defined, we will accept other - * check types too, but then the check won't be verified and - * a warning (XZ_UNSUPPORTED_CHECK) will be given. - */ - s->check_type = s->temp.buf[HEADER_MAGIC_SIZE + 1]; - -#ifdef XZ_DEC_ANY_CHECK - if (s->check_type > XZ_CHECK_MAX) - return XZ_OPTIONS_ERROR; - - if (s->check_type > XZ_CHECK_CRC32 && !IS_CRC64(s->check_type)) - return XZ_UNSUPPORTED_CHECK; -#else - if (s->check_type > XZ_CHECK_CRC32 && !IS_CRC64(s->check_type)) - return XZ_OPTIONS_ERROR; -#endif - - return XZ_OK; -} - -/* Decode the Stream Footer field (the last 12 bytes of the .xz Stream) */ -static enum xz_ret dec_stream_footer(struct xz_dec *s) -{ - if (!memeq(s->temp.buf + 10, FOOTER_MAGIC, FOOTER_MAGIC_SIZE)) - return XZ_DATA_ERROR; - - if (xz_crc32(s->temp.buf + 4, 6, 0) != get_le32(s->temp.buf)) - return XZ_DATA_ERROR; - - /* - * Validate Backward Size. Note that we never added the size of the - * Index CRC32 field to s->index.size, thus we use s->index.size / 4 - * instead of s->index.size / 4 - 1. - */ - if ((s->index.size >> 2) != get_le32(s->temp.buf + 4)) - return XZ_DATA_ERROR; - - if (s->temp.buf[8] != 0 || s->temp.buf[9] != s->check_type) - return XZ_DATA_ERROR; - - /* - * Use XZ_STREAM_END instead of XZ_OK to be more convenient - * for the caller. - */ - return XZ_STREAM_END; -} - -/* Decode the Block Header and initialize the filter chain. */ -static enum xz_ret dec_block_header(struct xz_dec *s) -{ - enum xz_ret ret; - - /* - * Validate the CRC32. We know that the temp buffer is at least - * eight bytes so this is safe. - */ - s->temp.size -= 4; - if (xz_crc32(s->temp.buf, s->temp.size, 0) - != get_le32(s->temp.buf + s->temp.size)) - return XZ_DATA_ERROR; - - s->temp.pos = 2; - - /* - * Catch unsupported Block Flags. We support only one or two filters - * in the chain, so we catch that with the same test. - */ -#ifdef XZ_DEC_BCJ - if (s->temp.buf[1] & 0x3E) -#else - if (s->temp.buf[1] & 0x3F) -#endif - return XZ_OPTIONS_ERROR; - - /* Compressed Size */ - if (s->temp.buf[1] & 0x40) { - if (dec_vli(s, s->temp.buf, &s->temp.pos, s->temp.size) - != XZ_STREAM_END) - return XZ_DATA_ERROR; - - s->block_header.compressed = s->vli; - } else { - s->block_header.compressed = VLI_UNKNOWN; - } - - /* Uncompressed Size */ - if (s->temp.buf[1] & 0x80) { - if (dec_vli(s, s->temp.buf, &s->temp.pos, s->temp.size) - != XZ_STREAM_END) - return XZ_DATA_ERROR; - - s->block_header.uncompressed = s->vli; - } else { - s->block_header.uncompressed = VLI_UNKNOWN; - } - -#ifdef XZ_DEC_BCJ - /* If there are two filters, the first one must be a BCJ filter. */ - s->bcj_active = s->temp.buf[1] & 0x01; - if (s->bcj_active) { - if (s->temp.size - s->temp.pos < 2) - return XZ_OPTIONS_ERROR; - - ret = xz_dec_bcj_reset(s->bcj, s->temp.buf[s->temp.pos++]); - if (ret != XZ_OK) - return ret; - - /* - * We don't support custom start offset, - * so Size of Properties must be zero. - */ - if (s->temp.buf[s->temp.pos++] != 0x00) - return XZ_OPTIONS_ERROR; - } -#endif - - /* Valid Filter Flags always take at least two bytes. */ - if (s->temp.size - s->temp.pos < 2) - return XZ_DATA_ERROR; - - /* Filter ID = LZMA2 */ - if (s->temp.buf[s->temp.pos++] != 0x21) - return XZ_OPTIONS_ERROR; - - /* Size of Properties = 1-byte Filter Properties */ - if (s->temp.buf[s->temp.pos++] != 0x01) - return XZ_OPTIONS_ERROR; - - /* Filter Properties contains LZMA2 dictionary size. */ - if (s->temp.size - s->temp.pos < 1) - return XZ_DATA_ERROR; - - ret = xz_dec_lzma2_reset(s->lzma2, s->temp.buf[s->temp.pos++]); - if (ret != XZ_OK) - return ret; - - /* The rest must be Header Padding. */ - while (s->temp.pos < s->temp.size) - if (s->temp.buf[s->temp.pos++] != 0x00) - return XZ_OPTIONS_ERROR; - - s->temp.pos = 0; - s->block.compressed = 0; - s->block.uncompressed = 0; - - return XZ_OK; -} - -static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b) -{ - enum xz_ret ret; - - /* - * Store the start position for the case when we are in the middle - * of the Index field. - */ - s->in_start = b->in_pos; - - while (true) { - switch (s->sequence) { - case SEQ_STREAM_HEADER: - /* - * Stream Header is copied to s->temp, and then - * decoded from there. This way if the caller - * gives us only little input at a time, we can - * still keep the Stream Header decoding code - * simple. Similar approach is used in many places - * in this file. - */ - if (!fill_temp(s, b)) - return XZ_OK; - - /* - * If dec_stream_header() returns - * XZ_UNSUPPORTED_CHECK, it is still possible - * to continue decoding if working in multi-call - * mode. Thus, update s->sequence before calling - * dec_stream_header(). - */ - s->sequence = SEQ_BLOCK_START; - - ret = dec_stream_header(s); - if (ret != XZ_OK) - return ret; - - case SEQ_BLOCK_START: - /* We need one byte of input to continue. */ - if (b->in_pos == b->in_size) - return XZ_OK; - - /* See if this is the beginning of the Index field. */ - if (b->in[b->in_pos] == 0) { - s->in_start = b->in_pos++; - s->sequence = SEQ_INDEX; - break; - } - - /* - * Calculate the size of the Block Header and - * prepare to decode it. - */ - s->block_header.size - = ((uint32_t)b->in[b->in_pos] + 1) * 4; - - s->temp.size = s->block_header.size; - s->temp.pos = 0; - s->sequence = SEQ_BLOCK_HEADER; - - case SEQ_BLOCK_HEADER: - if (!fill_temp(s, b)) - return XZ_OK; - - ret = dec_block_header(s); - if (ret != XZ_OK) - return ret; - - s->sequence = SEQ_BLOCK_UNCOMPRESS; - - case SEQ_BLOCK_UNCOMPRESS: - ret = dec_block(s, b); - if (ret != XZ_STREAM_END) - return ret; - - s->sequence = SEQ_BLOCK_PADDING; - - case SEQ_BLOCK_PADDING: - /* - * Size of Compressed Data + Block Padding - * must be a multiple of four. We don't need - * s->block.compressed for anything else - * anymore, so we use it here to test the size - * of the Block Padding field. - */ - while (s->block.compressed & 3) { - if (b->in_pos == b->in_size) - return XZ_OK; - - if (b->in[b->in_pos++] != 0) - return XZ_DATA_ERROR; - - ++s->block.compressed; - } - - s->sequence = SEQ_BLOCK_CHECK; - - case SEQ_BLOCK_CHECK: - if (s->check_type == XZ_CHECK_CRC32) { - ret = crc_validate(s, b, 32); - if (ret != XZ_STREAM_END) - return ret; - } - else if (IS_CRC64(s->check_type)) { - ret = crc_validate(s, b, 64); - if (ret != XZ_STREAM_END) - return ret; - } -#ifdef XZ_DEC_ANY_CHECK - else if (!check_skip(s, b)) { - return XZ_OK; - } -#endif - - s->sequence = SEQ_BLOCK_START; - break; - - case SEQ_INDEX: - ret = dec_index(s, b); - if (ret != XZ_STREAM_END) - return ret; - - s->sequence = SEQ_INDEX_PADDING; - - case SEQ_INDEX_PADDING: - while ((s->index.size + (b->in_pos - s->in_start)) - & 3) { - if (b->in_pos == b->in_size) { - index_update(s, b); - return XZ_OK; - } - - if (b->in[b->in_pos++] != 0) - return XZ_DATA_ERROR; - } - - /* Finish the CRC32 value and Index size. */ - index_update(s, b); - - /* Compare the hashes to validate the Index field. */ - if (!memeq(&s->block.hash, &s->index.hash, - sizeof(s->block.hash))) - return XZ_DATA_ERROR; - - s->sequence = SEQ_INDEX_CRC32; - - case SEQ_INDEX_CRC32: - ret = crc_validate(s, b, 32); - if (ret != XZ_STREAM_END) - return ret; - - s->temp.size = STREAM_HEADER_SIZE; - s->sequence = SEQ_STREAM_FOOTER; - - case SEQ_STREAM_FOOTER: - if (!fill_temp(s, b)) - return XZ_OK; - - return dec_stream_footer(s); - } - } - - /* Never reached */ -} - -/* - * xz_dec_run() is a wrapper for dec_main() to handle some special cases in - * multi-call and single-call decoding. - * - * In multi-call mode, we must return XZ_BUF_ERROR when it seems clear that we - * are not going to make any progress anymore. This is to prevent the caller - * from calling us infinitely when the input file is truncated or otherwise - * corrupt. Since zlib-style API allows that the caller fills the input buffer - * only when the decoder doesn't produce any new output, we have to be careful - * to avoid returning XZ_BUF_ERROR too easily: XZ_BUF_ERROR is returned only - * after the second consecutive call to xz_dec_run() that makes no progress. - * - * In single-call mode, if we couldn't decode everything and no error - * occurred, either the input is truncated or the output buffer is too small. - * Since we know that the last input byte never produces any output, we know - * that if all the input was consumed and decoding wasn't finished, the file - * must be corrupt. Otherwise the output buffer has to be too small or the - * file is corrupt in a way that decoding it produces too big output. - * - * If single-call decoding fails, we reset b->in_pos and b->out_pos back to - * their original values. This is because with some filter chains there won't - * be any valid uncompressed data in the output buffer unless the decoding - * actually succeeds (that's the price to pay of using the output buffer as - * the workspace). - */ -XZ_EXTERN enum xz_ret xz_dec_run(struct xz_dec *s, struct xz_buf *b) -{ - size_t in_start; - size_t out_start; - enum xz_ret ret; - - if (DEC_IS_SINGLE(s->mode)) - xz_dec_reset(s); - - in_start = b->in_pos; - out_start = b->out_pos; - ret = dec_main(s, b); - - if (DEC_IS_SINGLE(s->mode)) { - if (ret == XZ_OK) - ret = b->in_pos == b->in_size - ? XZ_DATA_ERROR : XZ_BUF_ERROR; - - if (ret != XZ_STREAM_END) { - b->in_pos = in_start; - b->out_pos = out_start; - } - - } else if (ret == XZ_OK && in_start == b->in_pos - && out_start == b->out_pos) { - if (s->allow_buf_error) - ret = XZ_BUF_ERROR; - - s->allow_buf_error = true; - } else { - s->allow_buf_error = false; - } - - return ret; -} - -XZ_EXTERN struct xz_dec *xz_dec_init(enum xz_mode mode, uint32_t dict_max) -{ - struct xz_dec *s = kmalloc(sizeof(*s), GFP_KERNEL); - if (s == NULL) - return NULL; - - s->mode = mode; - -#ifdef XZ_DEC_BCJ - s->bcj = xz_dec_bcj_create(DEC_IS_SINGLE(mode)); - if (s->bcj == NULL) - goto error_bcj; -#endif - - s->lzma2 = xz_dec_lzma2_create(mode, dict_max); - if (s->lzma2 == NULL) - goto error_lzma2; - - xz_dec_reset(s); - return s; - -error_lzma2: -#ifdef XZ_DEC_BCJ - xz_dec_bcj_end(s->bcj); -error_bcj: -#endif - kfree(s); - return NULL; -} - -XZ_EXTERN void xz_dec_reset(struct xz_dec *s) -{ - s->sequence = SEQ_STREAM_HEADER; - s->allow_buf_error = false; - s->pos = 0; - s->crc = 0; - memzero(&s->block, sizeof(s->block)); - memzero(&s->index, sizeof(s->index)); - s->temp.pos = 0; - s->temp.size = STREAM_HEADER_SIZE; -} - -XZ_EXTERN void xz_dec_end(struct xz_dec *s) -{ - if (s != NULL) { - xz_dec_lzma2_end(s->lzma2); -#ifdef XZ_DEC_BCJ - xz_dec_bcj_end(s->bcj); -#endif - kfree(s); - } -} diff --git a/cpukit/libmisc/xz/xz_lzma2.h b/cpukit/libmisc/xz/xz_lzma2.h deleted file mode 100644 index 071d67bee9..0000000000 --- a/cpukit/libmisc/xz/xz_lzma2.h +++ /dev/null @@ -1,204 +0,0 @@ -/* - * LZMA2 definitions - * - * Authors: Lasse Collin <lasse.collin@tukaani.org> - * Igor Pavlov <http://7-zip.org/> - * - * This file has been put into the public domain. - * You can do whatever you want with this file. - */ - -#ifndef XZ_LZMA2_H -#define XZ_LZMA2_H - -/* Range coder constants */ -#define RC_SHIFT_BITS 8 -#define RC_TOP_BITS 24 -#define RC_TOP_VALUE (1 << RC_TOP_BITS) -#define RC_BIT_MODEL_TOTAL_BITS 11 -#define RC_BIT_MODEL_TOTAL (1 << RC_BIT_MODEL_TOTAL_BITS) -#define RC_MOVE_BITS 5 - -/* - * Maximum number of position states. A position state is the lowest pb - * number of bits of the current uncompressed offset. In some places there - * are different sets of probabilities for different position states. - */ -#define POS_STATES_MAX (1 << 4) - -/* - * This enum is used to track which LZMA symbols have occurred most recently - * and in which order. This information is used to predict the next symbol. - * - * Symbols: - * - Literal: One 8-bit byte - * - Match: Repeat a chunk of data at some distance - * - Long repeat: Multi-byte match at a recently seen distance - * - Short repeat: One-byte repeat at a recently seen distance - * - * The symbol names are in from STATE_oldest_older_previous. REP means - * either short or long repeated match, and NONLIT means any non-literal. - */ -enum lzma_state { - STATE_LIT_LIT, - STATE_MATCH_LIT_LIT, - STATE_REP_LIT_LIT, - STATE_SHORTREP_LIT_LIT, - STATE_MATCH_LIT, - STATE_REP_LIT, - STATE_SHORTREP_LIT, - STATE_LIT_MATCH, - STATE_LIT_LONGREP, - STATE_LIT_SHORTREP, - STATE_NONLIT_MATCH, - STATE_NONLIT_REP -}; - -/* Total number of states */ -#define STATES 12 - -/* The lowest 7 states indicate that the previous state was a literal. */ -#define LIT_STATES 7 - -/* Indicate that the latest symbol was a literal. */ -static inline void lzma_state_literal(enum lzma_state *state) -{ - if (*state <= STATE_SHORTREP_LIT_LIT) - *state = STATE_LIT_LIT; - else if (*state <= STATE_LIT_SHORTREP) - *state -= 3; - else - *state -= 6; -} - -/* Indicate that the latest symbol was a match. */ -static inline void lzma_state_match(enum lzma_state *state) -{ - *state = *state < LIT_STATES ? STATE_LIT_MATCH : STATE_NONLIT_MATCH; -} - -/* Indicate that the latest state was a long repeated match. */ -static inline void lzma_state_long_rep(enum lzma_state *state) -{ - *state = *state < LIT_STATES ? STATE_LIT_LONGREP : STATE_NONLIT_REP; -} - -/* Indicate that the latest symbol was a short match. */ -static inline void lzma_state_short_rep(enum lzma_state *state) -{ - *state = *state < LIT_STATES ? STATE_LIT_SHORTREP : STATE_NONLIT_REP; -} - -/* Test if the previous symbol was a literal. */ -static inline bool lzma_state_is_literal(enum lzma_state state) -{ - return state < LIT_STATES; -} - -/* Each literal coder is divided in three sections: - * - 0x001-0x0FF: Without match byte - * - 0x101-0x1FF: With match byte; match bit is 0 - * - 0x201-0x2FF: With match byte; match bit is 1 - * - * Match byte is used when the previous LZMA symbol was something else than - * a literal (that is, it was some kind of match). - */ -#define LITERAL_CODER_SIZE 0x300 - -/* Maximum number of literal coders */ -#define LITERAL_CODERS_MAX (1 << 4) - -/* Minimum length of a match is two bytes. */ -#define MATCH_LEN_MIN 2 - -/* Match length is encoded with 4, 5, or 10 bits. - * - * Length Bits - * 2-9 4 = Choice=0 + 3 bits - * 10-17 5 = Choice=1 + Choice2=0 + 3 bits - * 18-273 10 = Choice=1 + Choice2=1 + 8 bits - */ -#define LEN_LOW_BITS 3 -#define LEN_LOW_SYMBOLS (1 << LEN_LOW_BITS) -#define LEN_MID_BITS 3 -#define LEN_MID_SYMBOLS (1 << LEN_MID_BITS) -#define LEN_HIGH_BITS 8 -#define LEN_HIGH_SYMBOLS (1 << LEN_HIGH_BITS) -#define LEN_SYMBOLS (LEN_LOW_SYMBOLS + LEN_MID_SYMBOLS + LEN_HIGH_SYMBOLS) - -/* - * Maximum length of a match is 273 which is a result of the encoding - * described above. - */ -#define MATCH_LEN_MAX (MATCH_LEN_MIN + LEN_SYMBOLS - 1) - -/* - * Different sets of probabilities are used for match distances that have - * very short match length: Lengths of 2, 3, and 4 bytes have a separate - * set of probabilities for each length. The matches with longer length - * use a shared set of probabilities. - */ -#define DIST_STATES 4 - -/* - * Get the index of the appropriate probability array for decoding - * the distance slot. - */ -static inline uint32_t lzma_get_dist_state(uint32_t len) -{ - return len < DIST_STATES + MATCH_LEN_MIN - ? len - MATCH_LEN_MIN : DIST_STATES - 1; -} - -/* - * The highest two bits of a 32-bit match distance are encoded using six bits. - * This six-bit value is called a distance slot. This way encoding a 32-bit - * value takes 6-36 bits, larger values taking more bits. - */ -#define DIST_SLOT_BITS 6 -#define DIST_SLOTS (1 << DIST_SLOT_BITS) - -/* Match distances up to 127 are fully encoded using probabilities. Since - * the highest two bits (distance slot) are always encoded using six bits, - * the distances 0-3 don't need any additional bits to encode, since the - * distance slot itself is the same as the actual distance. DIST_MODEL_START - * indicates the first distance slot where at least one additional bit is - * needed. - */ -#define DIST_MODEL_START 4 - -/* - * Match distances greater than 127 are encoded in three pieces: - * - distance slot: the highest two bits - * - direct bits: 2-26 bits below the highest two bits - * - alignment bits: four lowest bits - * - * Direct bits don't use any probabilities. - * - * The distance slot value of 14 is for distances 128-191. - */ -#define DIST_MODEL_END 14 - -/* Distance slots that indicate a distance <= 127. */ -#define FULL_DISTANCES_BITS (DIST_MODEL_END / 2) -#define FULL_DISTANCES (1 << FULL_DISTANCES_BITS) - -/* - * For match distances greater than 127, only the highest two bits and the - * lowest four bits (alignment) is encoded using probabilities. - */ -#define ALIGN_BITS 4 -#define ALIGN_SIZE (1 << ALIGN_BITS) -#define ALIGN_MASK (ALIGN_SIZE - 1) - -/* Total number of all probability variables */ -#define PROBS_TOTAL (1846 + LITERAL_CODERS_MAX * LITERAL_CODER_SIZE) - -/* - * LZMA remembers the four most recent match distances. Reusing these - * distances tends to take less space than re-encoding the actual - * distance value. - */ -#define REPS 4 - -#endif diff --git a/cpukit/libmisc/xz/xz_private.h b/cpukit/libmisc/xz/xz_private.h deleted file mode 100644 index 482b90f363..0000000000 --- a/cpukit/libmisc/xz/xz_private.h +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Private includes and definitions - * - * Author: Lasse Collin <lasse.collin@tukaani.org> - * - * This file has been put into the public domain. - * You can do whatever you want with this file. - */ - -#ifndef XZ_PRIVATE_H -#define XZ_PRIVATE_H - -#ifdef __KERNEL__ -# include <linux/xz.h> -# include <linux/kernel.h> -# include <asm/unaligned.h> - /* XZ_PREBOOT may be defined only via decompress_unxz.c. */ -# ifndef XZ_PREBOOT -# include <linux/slab.h> -# include <linux/vmalloc.h> -# include <linux/string.h> -# ifdef CONFIG_XZ_DEC_X86 -# define XZ_DEC_X86 -# endif -# ifdef CONFIG_XZ_DEC_POWERPC -# define XZ_DEC_POWERPC -# endif -# ifdef CONFIG_XZ_DEC_IA64 -# define XZ_DEC_IA64 -# endif -# ifdef CONFIG_XZ_DEC_ARM -# define XZ_DEC_ARM -# endif -# ifdef CONFIG_XZ_DEC_ARMTHUMB -# define XZ_DEC_ARMTHUMB -# endif -# ifdef CONFIG_XZ_DEC_SPARC -# define XZ_DEC_SPARC -# endif -# define memeq(a, b, size) (memcmp(a, b, size) == 0) -# define memzero(buf, size) memset(buf, 0, size) -# endif -# define get_le32(p) le32_to_cpup((const uint32_t *)(p)) -#else - /* - * For userspace builds, use a separate header to define the required - * macros and functions. This makes it easier to adapt the code into - * different environments and avoids clutter in the Linux kernel tree. - */ -# include "xz_config.h" -#endif - -/* If no specific decoding mode is requested, enable support for all modes. */ -#if !defined(XZ_DEC_SINGLE) && !defined(XZ_DEC_PREALLOC) \ - && !defined(XZ_DEC_DYNALLOC) -# define XZ_DEC_SINGLE -# define XZ_DEC_PREALLOC -# define XZ_DEC_DYNALLOC -#endif - -/* - * The DEC_IS_foo(mode) macros are used in "if" statements. If only some - * of the supported modes are enabled, these macros will evaluate to true or - * false at compile time and thus allow the compiler to omit unneeded code. - */ -#ifdef XZ_DEC_SINGLE -# define DEC_IS_SINGLE(mode) ((mode) == XZ_SINGLE) -#else -# define DEC_IS_SINGLE(mode) (false) -#endif - -#ifdef XZ_DEC_PREALLOC -# define DEC_IS_PREALLOC(mode) ((mode) == XZ_PREALLOC) -#else -# define DEC_IS_PREALLOC(mode) (false) -#endif - -#ifdef XZ_DEC_DYNALLOC -# define DEC_IS_DYNALLOC(mode) ((mode) == XZ_DYNALLOC) -#else -# define DEC_IS_DYNALLOC(mode) (false) -#endif - -#if !defined(XZ_DEC_SINGLE) -# define DEC_IS_MULTI(mode) (true) -#elif defined(XZ_DEC_PREALLOC) || defined(XZ_DEC_DYNALLOC) -# define DEC_IS_MULTI(mode) ((mode) != XZ_SINGLE) -#else -# define DEC_IS_MULTI(mode) (false) -#endif - -/* - * If any of the BCJ filter decoders are wanted, define XZ_DEC_BCJ. - * XZ_DEC_BCJ is used to enable generic support for BCJ decoders. - */ -#ifndef XZ_DEC_BCJ -# if defined(XZ_DEC_X86) || defined(XZ_DEC_POWERPC) \ - || defined(XZ_DEC_IA64) || defined(XZ_DEC_ARM) \ - || defined(XZ_DEC_ARM) || defined(XZ_DEC_ARMTHUMB) \ - || defined(XZ_DEC_SPARC) -# define XZ_DEC_BCJ -# endif -#endif - -/* - * Allocate memory for LZMA2 decoder. xz_dec_lzma2_reset() must be used - * before calling xz_dec_lzma2_run(). - */ -XZ_EXTERN struct xz_dec_lzma2 *xz_dec_lzma2_create(enum xz_mode mode, - uint32_t dict_max); - -/* - * Decode the LZMA2 properties (one byte) and reset the decoder. Return - * XZ_OK on success, XZ_MEMLIMIT_ERROR if the preallocated dictionary is not - * big enough, and XZ_OPTIONS_ERROR if props indicates something that this - * decoder doesn't support. - */ -XZ_EXTERN enum xz_ret xz_dec_lzma2_reset(struct xz_dec_lzma2 *s, - uint8_t props); - -/* Decode raw LZMA2 stream from b->in to b->out. */ -XZ_EXTERN enum xz_ret xz_dec_lzma2_run(struct xz_dec_lzma2 *s, - struct xz_buf *b); - -/* Free the memory allocated for the LZMA2 decoder. */ -XZ_EXTERN void xz_dec_lzma2_end(struct xz_dec_lzma2 *s); - -#ifdef XZ_DEC_BCJ -/* - * Allocate memory for BCJ decoders. xz_dec_bcj_reset() must be used before - * calling xz_dec_bcj_run(). - */ -XZ_EXTERN struct xz_dec_bcj *xz_dec_bcj_create(bool single_call); - -/* - * Decode the Filter ID of a BCJ filter. This implementation doesn't - * support custom start offsets, so no decoding of Filter Properties - * is needed. Returns XZ_OK if the given Filter ID is supported. - * Otherwise XZ_OPTIONS_ERROR is returned. - */ -XZ_EXTERN enum xz_ret xz_dec_bcj_reset(struct xz_dec_bcj *s, uint8_t id); - -/* - * Decode raw BCJ + LZMA2 stream. This must be used only if there actually is - * a BCJ filter in the chain. If the chain has only LZMA2, xz_dec_lzma2_run() - * must be called directly. - */ -XZ_EXTERN enum xz_ret xz_dec_bcj_run(struct xz_dec_bcj *s, - struct xz_dec_lzma2 *lzma2, - struct xz_buf *b); - -/* Free the memory allocated for the BCJ filters. */ -#define xz_dec_bcj_end(s) kfree(s) -#endif - -#endif diff --git a/cpukit/libmisc/xz/xz_stream.h b/cpukit/libmisc/xz/xz_stream.h deleted file mode 100644 index 66cb5a7055..0000000000 --- a/cpukit/libmisc/xz/xz_stream.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Definitions for handling the .xz file format - * - * Author: Lasse Collin <lasse.collin@tukaani.org> - * - * This file has been put into the public domain. - * You can do whatever you want with this file. - */ - -#ifndef XZ_STREAM_H -#define XZ_STREAM_H - -#if defined(__KERNEL__) && !XZ_INTERNAL_CRC32 -# include <linux/crc32.h> -# undef crc32 -# define xz_crc32(buf, size, crc) \ - (~crc32_le(~(uint32_t)(crc), buf, size)) -#endif - -/* - * See the .xz file format specification at - * http://tukaani.org/xz/xz-file-format.txt - * to understand the container format. - */ - -#define STREAM_HEADER_SIZE 12 - -#define HEADER_MAGIC "\3757zXZ" -#define HEADER_MAGIC_SIZE 6 - -#define FOOTER_MAGIC "YZ" -#define FOOTER_MAGIC_SIZE 2 - -/* - * Variable-length integer can hold a 63-bit unsigned integer or a special - * value indicating that the value is unknown. - * - * Experimental: vli_type can be defined to uint32_t to save a few bytes - * in code size (no effect on speed). Doing so limits the uncompressed and - * compressed size of the file to less than 256 MiB and may also weaken - * error detection slightly. - */ -typedef uint64_t vli_type; - -#define VLI_MAX ((vli_type)-1 / 2) -#define VLI_UNKNOWN ((vli_type)-1) - -/* Maximum encoded size of a VLI */ -#define VLI_BYTES_MAX (sizeof(vli_type) * 8 / 7) - -/* Integrity Check types */ -enum xz_check { - XZ_CHECK_NONE = 0, - XZ_CHECK_CRC32 = 1, - XZ_CHECK_CRC64 = 4, - XZ_CHECK_SHA256 = 10 -}; - -/* Maximum possible Check ID */ -#define XZ_CHECK_MAX 15 - -#endif |