Skip to content

Commit

Permalink
ext: libmetal: Update import of libmetal from b4b5bea to a4f7630
Browse files Browse the repository at this point in the history
Pull in a more recent version of libmetal, motivated by the void
pointer fixes in efc33fe.

libmetal's b4b5bea to a4f7630 spans:

a4f7630 linux: device: fix max chars to copy for the dev name
10a0d5b lib: system: freertos: mutex: change to use atomic_int ...
4e670c5 ci: Zephyr env var for toolchain
3bef6f0 cmake: Fix Zephyr library integration
13158c3 compiler: add IAR compiler file
0820a2e microblaze: suppress io 64-bit R/W access if 64 bit atomic ...
e2e5608 io: suppress io 64 bit R/W access if 64 bit atomic not ...
efc33fe io: fix compilation error for void pointers.
32ad1d2 cache: fix compilation issue
c1ade0d travis CI: update Zephyr SDK version to 0.9.3
c49d7cd travis CI: updated arm compiler ubuntu package
d279a6a travis ci: Update FreeRTOS download path
5c70105 irq: update sys_irq_restore_enable and sys_irq_save_disable
05f0cd4 cmake: Only look for doxygen package if docs enabled
b4b5bea zephyr: Introduce WITH_ZEPHYR_LIB option

At current time of writing, libmetal's HEAD is 5bc2106641.
However this failed to build in their Travis CI.
The latest passing commit is a4f7630.

Signed-off-by: Mark Ruvald Pedersen <mped@oticon.com>
  • Loading branch information
mped-oticon authored and nashif committed Sep 28, 2018
1 parent 3a8e37c commit 6a35524
Show file tree
Hide file tree
Showing 27 changed files with 145 additions and 160 deletions.
8 changes: 3 additions & 5 deletions ext/hal/libmetal/README
Expand Up @@ -4,10 +4,8 @@ libmetal
Origin:
https://github.com/OpenAMP/libmetal

Status:
b4b5beab4b71388d63c732470b6d6da606ae8ffc

When we import libmetal we removed the tests/ and examples/ dir to reduce
Import instructions:
When we import libmetal we remove the tests/ and examples/ dir to reduce
the amount of code imported.

Purpose:
Expand All @@ -29,7 +27,7 @@ URL:
https://github.com/OpenAMP/libmetal

commit:
b4b5beab4b71388d63c732470b6d6da606ae8ffc
a4f763094cb26cd8f7abdff251f57a6a802c039d

Maintained-by:
External
Expand Down
11 changes: 6 additions & 5 deletions ext/hal/libmetal/libmetal/.travis.yml
Expand Up @@ -8,14 +8,15 @@ dist: trusty

env:
global:
- ZEPHYR_GCC_VARIANT=zephyr
- ZEPHYR_TOOLCHAIN_VARIANT=zephyr
- ZEPHYR_SDK_INSTALL_DIR=/opt/zephyr-sdk
- ZEPHYR_BASE=$TRAVIS_BUILD_DIR/deps/zephyr
- ZEPHYR_SDK_VERSION=0.9.2
- ZEPHYR_SDK_VERSION=0.9.3
- ZEPHYR_SDK_DOWNLOAD_FOLDER=https://github.com/zephyrproject-rtos/meta-zephyr-sdk/releases/download/$ZEPHYR_SDK_VERSION
- ZEPHYR_SDK_SETUP_BINARY=zephyr-sdk-$ZEPHYR_SDK_VERSION-setup.run
- ZEPHYR_SDK_DOWNLOAD_URL=$ZEPHYR_SDK_DOWNLOAD_FOLDER/$ZEPHYR_SDK_SETUP_BINARY
- FREERTOS_ZIP_URL=https://downloads.sourceforge.net/project/freertos/FreeRTOS/V10.0.1/FreeRTOSv10.0.1.zip
- FREERTOS_ZIP_URL=https://cfhcable.dl.sourceforge.net/project/freertos/FreeRTOS/V10.0.1/FreeRTOSv10.0.1.zip
- GCC_ARM_COMPILER_PACKAGE=gcc-arm-embedded_7-2018q2-1~trusty1_amd64.deb

matrix:
fast_finish: true
Expand Down Expand Up @@ -47,8 +48,8 @@ before_install:
fi
# This is to kick start CI on generic platform. Will need to have a proper way to get the required packages
- if [[ "$TARGET" == "generic" || "$TARGET" == "freertos" ]]; then
wget http://ppa.launchpad.net/team-gcc-arm-embedded/ppa/ubuntu/pool/main/g/gcc-arm-none-eabi/gcc-arm-embedded_7-2017q4-1~trusty3_amd64.deb &&
sudo dpkg -i gcc-arm-embedded_7-2017q4-1~trusty3_amd64.deb;
wget http://ppa.launchpad.net/team-gcc-arm-embedded/ppa/ubuntu/pool/main/g/gcc-arm-none-eabi/${GCC_ARM_COMPILER_PACKAGE} &&
sudo dpkg -i ${GCC_ARM_COMPILER_PACKAGE};
fi
- if [[ "$TARGET" == "freertos" ]]; then
wget $FREERTOS_ZIP_URL &&
Expand Down
4 changes: 3 additions & 1 deletion ext/hal/libmetal/libmetal/cmake/depends.cmake
@@ -1,4 +1,6 @@
find_package (Doxygen)
if (WITH_DOC)
find_package (Doxygen)
endif (WITH_DOC)

if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")

Expand Down
2 changes: 1 addition & 1 deletion ext/hal/libmetal/libmetal/lib/CMakeLists.txt
Expand Up @@ -63,7 +63,7 @@ endif (WITH_DEFAULT_LOGGER)
if (WITH_ZEPHYR)
zephyr_library_named(metal)
add_dependencies(metal offsets_h)
target_sources (metal PRIVATE ${_sources})
zephyr_library_sources(${_sources})
zephyr_include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
else (WITH_ZEPHYR)
# Build a shared library if so configured.
Expand Down
4 changes: 2 additions & 2 deletions ext/hal/libmetal/libmetal/lib/cache.h
Expand Up @@ -32,7 +32,7 @@ extern "C" {
*/
static inline void metal_cache_flush(void *addr, unsigned int len)
{
return __metal_cache_flush(addr, len);
__metal_cache_flush(addr, len);
}

/**
Expand All @@ -45,7 +45,7 @@ static inline void metal_cache_flush(void *addr, unsigned int len)
*/
static inline void metal_cache_invalidate(void *addr, unsigned int len)
{
return __metal_cache_invalidate(addr, len);
__metal_cache_invalidate(addr, len);
}

/** @} */
Expand Down
2 changes: 2 additions & 0 deletions ext/hal/libmetal/libmetal/lib/compiler.h
Expand Up @@ -14,6 +14,8 @@

#if defined(__GNUC__)
# include <metal/compiler/gcc/compiler.h>
#elif defined(__ICCARM__)
# include <metal/compiler/iar/compiler.h>
#else
# error "Missing compiler support"
#endif
Expand Down
1 change: 1 addition & 0 deletions ext/hal/libmetal/libmetal/lib/compiler/CMakeLists.txt
@@ -1,3 +1,4 @@
add_subdirectory (gcc)
add_subdirectory (iar)

# vim: expandtab:ts=2:sw=2:smartindent
3 changes: 3 additions & 0 deletions ext/hal/libmetal/libmetal/lib/compiler/iar/CMakeLists.txt
@@ -0,0 +1,3 @@
collect (PROJECT_LIB_HEADERS compiler.h)

# vim: expandtab:ts=2:sw=2:smartindent
27 changes: 27 additions & 0 deletions ext/hal/libmetal/libmetal/lib/compiler/iar/compiler.h
@@ -0,0 +1,27 @@
/*
* Copyright (c) 2018, ST Microelectronics. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/

/*
* @file iar/compiler.h
* @brief IAR specific primitives for libmetal.
*/

#ifndef __METAL_IAR_COMPILER__H__
#define __METAL_IAR_COMPILER__H__

#ifdef __cplusplus
extern "C" {
#endif

#define restrict __restrict__
#define metal_align(n) __attribute__((aligned(n)))
#define metal_weak __attribute__((weak))

#ifdef __cplusplus
}
#endif

#endif /* __METAL_IAR_COMPILER__H__ */
36 changes: 19 additions & 17 deletions ext/hal/libmetal/libmetal/lib/io.c
Expand Up @@ -33,7 +33,8 @@ void metal_io_init(struct metal_io_region *io, void *virt,
int metal_io_block_read(struct metal_io_region *io, unsigned long offset,
void *restrict dst, int len)
{
void *ptr = metal_io_virt(io, offset);
unsigned char *ptr = metal_io_virt(io, offset);
unsigned char *dest = dst;
int retlen;

if (offset > io->size)
Expand All @@ -47,20 +48,20 @@ int metal_io_block_read(struct metal_io_region *io, unsigned long offset,
} else {
atomic_thread_fence(memory_order_seq_cst);
while ( len && (
((uintptr_t)dst % sizeof(int)) ||
((uintptr_t)dest % sizeof(int)) ||
((uintptr_t)ptr % sizeof(int)))) {
*(unsigned char *)dst =
*(unsigned char *)dest =
*(const unsigned char *)ptr;
dst++;
dest++;
ptr++;
len--;
}
for (; len >= (int)sizeof(int); dst += sizeof(int),
for (; len >= (int)sizeof(int); dest += sizeof(int),
ptr += sizeof(int),
len -= sizeof(int))
*(unsigned int *)dst = *(const unsigned int *)ptr;
for (; len != 0; dst++, ptr++, len--)
*(unsigned char *)dst =
*(unsigned int *)dest = *(const unsigned int *)ptr;
for (; len != 0; dest++, ptr++, len--)
*(unsigned char *)dest =
*(const unsigned char *)ptr;
}
return retlen;
Expand All @@ -69,7 +70,8 @@ int metal_io_block_read(struct metal_io_region *io, unsigned long offset,
int metal_io_block_write(struct metal_io_region *io, unsigned long offset,
const void *restrict src, int len)
{
void *ptr = metal_io_virt(io, offset);
unsigned char *ptr = metal_io_virt(io, offset);
const unsigned char *source = src;
int retlen;

if (offset > io->size)
Expand All @@ -83,20 +85,20 @@ int metal_io_block_write(struct metal_io_region *io, unsigned long offset,
} else {
while ( len && (
((uintptr_t)ptr % sizeof(int)) ||
((uintptr_t)src % sizeof(int)))) {
((uintptr_t)source % sizeof(int)))) {
*(unsigned char *)ptr =
*(const unsigned char *)src;
*(const unsigned char *)source;
ptr++;
src++;
source++;
len--;
}
for (; len >= (int)sizeof(int); ptr += sizeof(int),
src += sizeof(int),
source += sizeof(int),
len -= sizeof(int))
*(unsigned int *)ptr = *(const unsigned int *)src;
for (; len != 0; ptr++, src++, len--)
*(unsigned int *)ptr = *(const unsigned int *)source;
for (; len != 0; ptr++, source++, len--)
*(unsigned char *)ptr =
*(const unsigned char *)src;
*(const unsigned char *)source;
atomic_thread_fence(memory_order_seq_cst);
}
return retlen;
Expand All @@ -105,7 +107,7 @@ int metal_io_block_write(struct metal_io_region *io, unsigned long offset,
int metal_io_block_set(struct metal_io_region *io, unsigned long offset,
unsigned char value, int len)
{
void *ptr = metal_io_virt(io, offset);
unsigned char *ptr = metal_io_virt(io, offset);
int retlen = len;

if (offset > io->size)
Expand Down
9 changes: 2 additions & 7 deletions ext/hal/libmetal/libmetal/lib/io.h
Expand Up @@ -233,12 +233,9 @@ metal_io_read(struct metal_io_region *io, unsigned long offset,
return atomic_load_explicit((atomic_uint *)ptr, order);
else if (ptr && sizeof(atomic_ulong) == width)
return atomic_load_explicit((atomic_ulong *)ptr, order);
else if (ptr && sizeof(atomic_ullong) == width)
#ifndef NO_ATOMIC_64_SUPPORT
else if (ptr && sizeof(atomic_ullong) == width)
return atomic_load_explicit((atomic_ullong *)ptr, order);

#else
return metal_processor_io_read64((atomic_ullong *)ptr, order);
#endif
metal_assert(0);
return 0; /* quiet compiler */
Expand Down Expand Up @@ -269,11 +266,9 @@ metal_io_write(struct metal_io_region *io, unsigned long offset,
atomic_store_explicit((atomic_uint *)ptr, value, order);
else if (ptr && sizeof(atomic_ulong) == width)
atomic_store_explicit((atomic_ulong *)ptr, value, order);
else if (ptr && sizeof(atomic_ullong) == width)
#ifndef NO_ATOMIC_64_SUPPORT
else if (ptr && sizeof(atomic_ullong) == width)
atomic_store_explicit((atomic_ullong *)ptr, value, order);
#else
metal_processor_io_write64((atomic_ullong *)ptr, value, order);
#endif
else
metal_assert (0);
Expand Down
24 changes: 0 additions & 24 deletions ext/hal/libmetal/libmetal/lib/processor/microblaze/cpu.h
Expand Up @@ -17,28 +17,4 @@

#define metal_cpu_yield()

static inline void metal_processor_io_write64(void *ptr, uint64_t value,
memory_order order)
{
void *tmp = &value;

atomic_store_explicit((atomic_ulong *)ptr, *((atomic_ulong *)tmp), order);
tmp += sizeof(atomic_ulong);
ptr += sizeof(atomic_ulong);
atomic_store_explicit((atomic_ulong *)ptr, *((atomic_ulong *)tmp), order);
}

static inline uint64_t metal_processor_io_read64(void *ptr, memory_order order)
{
uint64_t long_ret;
void *tmp = &long_ret;

*((atomic_ulong *)tmp) = atomic_load_explicit((atomic_ulong *)ptr, order);
tmp += sizeof(atomic_ulong);
ptr += sizeof(atomic_ulong);
*((atomic_ulong *)tmp) = atomic_load_explicit((atomic_ulong *)ptr, order);

return long_ret;
}

#endif /* __METAL_MICROBLAZE__H__ */
7 changes: 2 additions & 5 deletions ext/hal/libmetal/libmetal/lib/system/freertos/irq.c
Expand Up @@ -234,15 +234,12 @@ int metal_irq_unregister(int irq,

unsigned int metal_irq_save_disable(void)
{
sys_irq_save_disable();
return 0;
return sys_irq_save_disable();
}

void metal_irq_restore_enable(unsigned int flags)
{
(void)flags;

sys_irq_restore_enable();
sys_irq_restore_enable(flags);
}

void metal_irq_enable(unsigned int vector)
Expand Down
32 changes: 12 additions & 20 deletions ext/hal/libmetal/libmetal/lib/system/freertos/mutex.h
Expand Up @@ -16,24 +16,22 @@
#ifndef __METAL_FREERTOS_MUTEX__H__
#define __METAL_FREERTOS_MUTEX__H__

#include <metal/assert.h>
#include "FreeRTOS.h"
#include "semphr.h"

#include <metal/atomic.h>
#include <stdlib.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef struct {
SemaphoreHandle_t m;
atomic_int v;
} metal_mutex_t;

/*
* METAL_MUTEX_INIT - used for initializing an mutex elmenet in a static struct
* or global
*/
#define METAL_MUTEX_INIT(m) { NULL }
#define METAL_MUTEX_INIT(m) { ATOMIC_VAR_INIT(0) }
/*
* METAL_MUTEX_DEFINE - used for defining and initializing a global or
* static singleton mutex
Expand All @@ -42,40 +40,34 @@ typedef struct {

static inline void __metal_mutex_init(metal_mutex_t *mutex)
{
metal_assert(mutex);
mutex->m = xSemaphoreCreateMutex();
metal_assert(mutex->m != NULL);
atomic_store(&mutex->v, 0);
}

static inline void __metal_mutex_deinit(metal_mutex_t *mutex)
{
metal_assert(mutex && mutex->m != NULL);
vSemaphoreDelete(mutex->m);
mutex->m=NULL;
(void)mutex;
}

static inline int __metal_mutex_try_acquire(metal_mutex_t *mutex)
{
metal_assert(mutex && mutex->m != NULL);
return xSemaphoreTake(mutex->m, ( TickType_t ) 0 );
return 1 - atomic_flag_test_and_set(&mutex->v);
}

static inline void __metal_mutex_acquire(metal_mutex_t *mutex)
{
metal_assert(mutex && mutex->m != NULL);
xSemaphoreTake(mutex->m, portMAX_DELAY);
while (atomic_flag_test_and_set(&mutex->v)) {
;
}
}

static inline void __metal_mutex_release(metal_mutex_t *mutex)
{
metal_assert(mutex && mutex->m != NULL);
xSemaphoreGive(mutex->m);
atomic_flag_clear(&mutex->v);
}

static inline int __metal_mutex_is_acquired(metal_mutex_t *mutex)
{
metal_assert(mutex && mutex->m != NULL);
return (NULL == xSemaphoreGetMutexHolder(mutex->m)) ? 0 : 1;
return atomic_load(&mutex->v);
}

#ifdef __cplusplus
Expand Down
4 changes: 2 additions & 2 deletions ext/hal/libmetal/libmetal/lib/system/freertos/sys.h
Expand Up @@ -38,12 +38,12 @@ struct metal_state {
/**
* @brief restore interrupts to state before disable_global_interrupt()
*/
void sys_irq_restore_enable(void);
void sys_irq_restore_enable(unsigned int flags);

/**
* @brief disable all interrupts
*/
void sys_irq_save_disable(void);
unsigned int sys_irq_save_disable(void);

#endif /* METAL_INTERNAL */

Expand Down

0 comments on commit 6a35524

Please sign in to comment.