ext: libmetal: Update import of libmetal from b4b5bea to a4f7630

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>
This commit is contained in:
Mark Ruvald Pedersen 2018-09-27 23:15:30 +02:00 committed by Anas Nashif
commit 6a3552433a
27 changed files with 145 additions and 160 deletions

View file

@ -4,10 +4,8 @@ libmetal
Origin: Origin:
https://github.com/OpenAMP/libmetal https://github.com/OpenAMP/libmetal
Status: Import instructions:
b4b5beab4b71388d63c732470b6d6da606ae8ffc When we import libmetal we remove the tests/ and examples/ dir to reduce
When we import libmetal we removed the tests/ and examples/ dir to reduce
the amount of code imported. the amount of code imported.
Purpose: Purpose:
@ -29,7 +27,7 @@ URL:
https://github.com/OpenAMP/libmetal https://github.com/OpenAMP/libmetal
commit: commit:
b4b5beab4b71388d63c732470b6d6da606ae8ffc a4f763094cb26cd8f7abdff251f57a6a802c039d
Maintained-by: Maintained-by:
External External

View file

@ -8,14 +8,15 @@ dist: trusty
env: env:
global: global:
- ZEPHYR_GCC_VARIANT=zephyr - ZEPHYR_TOOLCHAIN_VARIANT=zephyr
- ZEPHYR_SDK_INSTALL_DIR=/opt/zephyr-sdk - ZEPHYR_SDK_INSTALL_DIR=/opt/zephyr-sdk
- ZEPHYR_BASE=$TRAVIS_BUILD_DIR/deps/zephyr - 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_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_SETUP_BINARY=zephyr-sdk-$ZEPHYR_SDK_VERSION-setup.run
- ZEPHYR_SDK_DOWNLOAD_URL=$ZEPHYR_SDK_DOWNLOAD_FOLDER/$ZEPHYR_SDK_SETUP_BINARY - 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: matrix:
fast_finish: true fast_finish: true
@ -47,8 +48,8 @@ before_install:
fi fi
# This is to kick start CI on generic platform. Will need to have a proper way to get the required packages # 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 - 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 && 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-embedded_7-2017q4-1~trusty3_amd64.deb; sudo dpkg -i ${GCC_ARM_COMPILER_PACKAGE};
fi fi
- if [[ "$TARGET" == "freertos" ]]; then - if [[ "$TARGET" == "freertos" ]]; then
wget $FREERTOS_ZIP_URL && wget $FREERTOS_ZIP_URL &&

View file

@ -1,4 +1,6 @@
find_package (Doxygen) if (WITH_DOC)
find_package (Doxygen)
endif (WITH_DOC)
if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")

View file

@ -63,7 +63,7 @@ endif (WITH_DEFAULT_LOGGER)
if (WITH_ZEPHYR) if (WITH_ZEPHYR)
zephyr_library_named(metal) zephyr_library_named(metal)
add_dependencies(metal offsets_h) add_dependencies(metal offsets_h)
target_sources (metal PRIVATE ${_sources}) zephyr_library_sources(${_sources})
zephyr_include_directories(${CMAKE_CURRENT_BINARY_DIR}/include) zephyr_include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
else (WITH_ZEPHYR) else (WITH_ZEPHYR)
# Build a shared library if so configured. # Build a shared library if so configured.

View file

@ -32,7 +32,7 @@ extern "C" {
*/ */
static inline void metal_cache_flush(void *addr, unsigned int len) static inline void metal_cache_flush(void *addr, unsigned int len)
{ {
return __metal_cache_flush(addr, len); __metal_cache_flush(addr, len);
} }
/** /**
@ -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) static inline void metal_cache_invalidate(void *addr, unsigned int len)
{ {
return __metal_cache_invalidate(addr, len); __metal_cache_invalidate(addr, len);
} }
/** @} */ /** @} */

View file

@ -14,6 +14,8 @@
#if defined(__GNUC__) #if defined(__GNUC__)
# include <metal/compiler/gcc/compiler.h> # include <metal/compiler/gcc/compiler.h>
#elif defined(__ICCARM__)
# include <metal/compiler/iar/compiler.h>
#else #else
# error "Missing compiler support" # error "Missing compiler support"
#endif #endif

View file

@ -1,3 +1,4 @@
add_subdirectory (gcc) add_subdirectory (gcc)
add_subdirectory (iar)
# vim: expandtab:ts=2:sw=2:smartindent # vim: expandtab:ts=2:sw=2:smartindent

View file

@ -0,0 +1,3 @@
collect (PROJECT_LIB_HEADERS compiler.h)
# vim: expandtab:ts=2:sw=2:smartindent

View file

@ -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__ */

View file

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

View file

@ -233,12 +233,9 @@ metal_io_read(struct metal_io_region *io, unsigned long offset,
return atomic_load_explicit((atomic_uint *)ptr, order); return atomic_load_explicit((atomic_uint *)ptr, order);
else if (ptr && sizeof(atomic_ulong) == width) else if (ptr && sizeof(atomic_ulong) == width)
return atomic_load_explicit((atomic_ulong *)ptr, order); return atomic_load_explicit((atomic_ulong *)ptr, order);
else if (ptr && sizeof(atomic_ullong) == width)
#ifndef NO_ATOMIC_64_SUPPORT #ifndef NO_ATOMIC_64_SUPPORT
else if (ptr && sizeof(atomic_ullong) == width)
return atomic_load_explicit((atomic_ullong *)ptr, order); return atomic_load_explicit((atomic_ullong *)ptr, order);
#else
return metal_processor_io_read64((atomic_ullong *)ptr, order);
#endif #endif
metal_assert(0); metal_assert(0);
return 0; /* quiet compiler */ return 0; /* quiet compiler */
@ -269,11 +266,9 @@ metal_io_write(struct metal_io_region *io, unsigned long offset,
atomic_store_explicit((atomic_uint *)ptr, value, order); atomic_store_explicit((atomic_uint *)ptr, value, order);
else if (ptr && sizeof(atomic_ulong) == width) else if (ptr && sizeof(atomic_ulong) == width)
atomic_store_explicit((atomic_ulong *)ptr, value, order); atomic_store_explicit((atomic_ulong *)ptr, value, order);
else if (ptr && sizeof(atomic_ullong) == width)
#ifndef NO_ATOMIC_64_SUPPORT #ifndef NO_ATOMIC_64_SUPPORT
else if (ptr && sizeof(atomic_ullong) == width)
atomic_store_explicit((atomic_ullong *)ptr, value, order); atomic_store_explicit((atomic_ullong *)ptr, value, order);
#else
metal_processor_io_write64((atomic_ullong *)ptr, value, order);
#endif #endif
else else
metal_assert (0); metal_assert (0);

View file

@ -17,28 +17,4 @@
#define metal_cpu_yield() #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__ */ #endif /* __METAL_MICROBLAZE__H__ */

View file

@ -234,15 +234,12 @@ int metal_irq_unregister(int irq,
unsigned int metal_irq_save_disable(void) unsigned int metal_irq_save_disable(void)
{ {
sys_irq_save_disable(); return sys_irq_save_disable();
return 0;
} }
void metal_irq_restore_enable(unsigned int flags) void metal_irq_restore_enable(unsigned int flags)
{ {
(void)flags; sys_irq_restore_enable(flags);
sys_irq_restore_enable();
} }
void metal_irq_enable(unsigned int vector) void metal_irq_enable(unsigned int vector)

View file

@ -16,24 +16,22 @@
#ifndef __METAL_FREERTOS_MUTEX__H__ #ifndef __METAL_FREERTOS_MUTEX__H__
#define __METAL_FREERTOS_MUTEX__H__ #define __METAL_FREERTOS_MUTEX__H__
#include <metal/assert.h> #include <metal/atomic.h>
#include "FreeRTOS.h" #include <stdlib.h>
#include "semphr.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
typedef struct { typedef struct {
SemaphoreHandle_t m; atomic_int v;
} metal_mutex_t; } metal_mutex_t;
/* /*
* METAL_MUTEX_INIT - used for initializing an mutex elmenet in a static struct * METAL_MUTEX_INIT - used for initializing an mutex elmenet in a static struct
* or global * 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 * METAL_MUTEX_DEFINE - used for defining and initializing a global or
* static singleton mutex * static singleton mutex
@ -42,40 +40,34 @@ typedef struct {
static inline void __metal_mutex_init(metal_mutex_t *mutex) static inline void __metal_mutex_init(metal_mutex_t *mutex)
{ {
metal_assert(mutex); atomic_store(&mutex->v, 0);
mutex->m = xSemaphoreCreateMutex();
metal_assert(mutex->m != NULL);
} }
static inline void __metal_mutex_deinit(metal_mutex_t *mutex) static inline void __metal_mutex_deinit(metal_mutex_t *mutex)
{ {
metal_assert(mutex && mutex->m != NULL); (void)mutex;
vSemaphoreDelete(mutex->m);
mutex->m=NULL;
} }
static inline int __metal_mutex_try_acquire(metal_mutex_t *mutex) static inline int __metal_mutex_try_acquire(metal_mutex_t *mutex)
{ {
metal_assert(mutex && mutex->m != NULL); return 1 - atomic_flag_test_and_set(&mutex->v);
return xSemaphoreTake(mutex->m, ( TickType_t ) 0 );
} }
static inline void __metal_mutex_acquire(metal_mutex_t *mutex) static inline void __metal_mutex_acquire(metal_mutex_t *mutex)
{ {
metal_assert(mutex && mutex->m != NULL); while (atomic_flag_test_and_set(&mutex->v)) {
xSemaphoreTake(mutex->m, portMAX_DELAY); ;
}
} }
static inline void __metal_mutex_release(metal_mutex_t *mutex) static inline void __metal_mutex_release(metal_mutex_t *mutex)
{ {
metal_assert(mutex && mutex->m != NULL); atomic_flag_clear(&mutex->v);
xSemaphoreGive(mutex->m);
} }
static inline int __metal_mutex_is_acquired(metal_mutex_t *mutex) static inline int __metal_mutex_is_acquired(metal_mutex_t *mutex)
{ {
metal_assert(mutex && mutex->m != NULL); return atomic_load(&mutex->v);
return (NULL == xSemaphoreGetMutexHolder(mutex->m)) ? 0 : 1;
} }
#ifdef __cplusplus #ifdef __cplusplus

View file

@ -38,12 +38,12 @@ struct metal_state {
/** /**
* @brief restore interrupts to state before disable_global_interrupt() * @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 * @brief disable all interrupts
*/ */
void sys_irq_save_disable(void); unsigned int sys_irq_save_disable(void);
#endif /* METAL_INTERNAL */ #endif /* METAL_INTERNAL */

View file

@ -14,13 +14,15 @@
#include <metal/utilities.h> #include <metal/utilities.h>
#include <stdint.h> #include <stdint.h>
void sys_irq_restore_enable(void) void sys_irq_restore_enable(unsigned int flags)
{ {
metal_unused(flags);
/* Add implementation here */ /* Add implementation here */
} }
void sys_irq_save_disable(void) unsigned int sys_irq_save_disable(void)
{ {
return 0;
/* Add implementation here */ /* Add implementation here */
} }

View file

@ -28,21 +28,19 @@
/* Mask off lower bits of addr */ /* Mask off lower bits of addr */
#define ARM_AR_MEM_TTB_SECT_SIZE_MASK (~(ARM_AR_MEM_TTB_SECT_SIZE-1UL)) #define ARM_AR_MEM_TTB_SECT_SIZE_MASK (~(ARM_AR_MEM_TTB_SECT_SIZE-1UL))
/* default value setting for disabling interrupts */ void sys_irq_restore_enable(unsigned int flags)
static unsigned int int_old_val = XIL_EXCEPTION_ALL;
void sys_irq_restore_enable(void)
{ {
Xil_ExceptionEnableMask(~int_old_val); Xil_ExceptionEnableMask(~flags);
} }
void sys_irq_save_disable(void) unsigned int sys_irq_save_disable(void)
{ {
int_old_val = mfcpsr() & XIL_EXCEPTION_ALL; unsigned int state = mfcpsr() & XIL_EXCEPTION_ALL;
if (XIL_EXCEPTION_ALL != int_old_val) { if (XIL_EXCEPTION_ALL != state) {
Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL); Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL);
} }
return state;
} }
void metal_machine_cache_flush(void *addr, unsigned int len) void metal_machine_cache_flush(void *addr, unsigned int len)

View file

@ -22,21 +22,19 @@
#define MB (1024 * 1024UL) #define MB (1024 * 1024UL)
#define GB (1024 * 1024 * 1024UL) #define GB (1024 * 1024 * 1024UL)
/* default value setting for disabling interrupts */ void sys_irq_restore_enable(unsigned int flags)
static unsigned int int_old_val = XIL_EXCEPTION_ALL;
void sys_irq_restore_enable(void)
{ {
Xil_ExceptionEnableMask(~int_old_val); Xil_ExceptionEnableMask(~flags);
} }
void sys_irq_save_disable(void) unsigned int sys_irq_save_disable(void)
{ {
int_old_val = mfcpsr() & XIL_EXCEPTION_ALL; unsigned int state = mfcpsr() & XIL_EXCEPTION_ALL;
if (XIL_EXCEPTION_ALL != int_old_val) { if (XIL_EXCEPTION_ALL != state) {
Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL); Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL);
} }
return state;
} }
void metal_machine_cache_flush(void *addr, unsigned int len) void metal_machine_cache_flush(void *addr, unsigned int len)

View file

@ -22,21 +22,19 @@
#define MPU_REGION_SIZE_MIN 0x20 #define MPU_REGION_SIZE_MIN 0x20
/* default value setting for disabling interrupts */ void sys_irq_restore_enable(unsigned int flags)
static unsigned int int_old_val = XIL_EXCEPTION_ALL;
void sys_irq_restore_enable(void)
{ {
Xil_ExceptionEnableMask(~int_old_val); Xil_ExceptionEnableMask(~flags);
} }
void sys_irq_save_disable(void) unsigned int sys_irq_save_disable(void)
{ {
int_old_val = mfcpsr() & XIL_EXCEPTION_ALL; unsigned int state = mfcpsr() & XIL_EXCEPTION_ALL;
if (XIL_EXCEPTION_ALL != int_old_val) { if (XIL_EXCEPTION_ALL != state) {
Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL); Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL);
} }
return state;
} }
void metal_machine_cache_flush(void *addr, unsigned int len) void metal_machine_cache_flush(void *addr, unsigned int len)

View file

@ -234,15 +234,12 @@ int metal_irq_unregister(int irq,
unsigned int metal_irq_save_disable(void) unsigned int metal_irq_save_disable(void)
{ {
sys_irq_save_disable(); return sys_irq_save_disable();
return 0;
} }
void metal_irq_restore_enable(unsigned int flags) void metal_irq_restore_enable(unsigned int flags)
{ {
(void)flags; sys_irq_restore_enable(flags);
sys_irq_restore_enable();
} }
void metal_irq_enable(unsigned int vector) void metal_irq_enable(unsigned int vector)

View file

@ -22,36 +22,36 @@
#define MSR_IE 0x2UL /* MicroBlaze status register interrupt enable mask */ #define MSR_IE 0x2UL /* MicroBlaze status register interrupt enable mask */
static unsigned int int_old_val = 0;
#if (XPAR_MICROBLAZE_USE_MSR_INSTR != 0) #if (XPAR_MICROBLAZE_USE_MSR_INSTR != 0)
void sys_irq_save_disable(void) unsigned int sys_irq_save_disable(void)
{ {
unsigned int state;
asm volatile(" mfs %0, rmsr \n" asm volatile(" mfs %0, rmsr \n"
" msrclr r0, %1 \n" " msrclr r0, %1 \n"
: "=r"(int_old_val) : "=r"(state)
: "i"(MSR_IE) : "i"(MSR_IE)
: "memory"); : "memory");
int_old_val &= MSR_IE; return state &= MSR_IE;
} }
#else /* XPAR_MICROBLAZE_USE_MSR_INSTR == 0 */ #else /* XPAR_MICROBLAZE_USE_MSR_INSTR == 0 */
void sys_irq_save_disable(void) unsigned int sys_irq_save_disable(void)
{ {
unsigned int tmp; unsigned int tmp, state;
asm volatile (" mfs %0, rmsr \n" asm volatile (" mfs %0, rmsr \n"
" andi %1, %0, %2 \n" " andi %1, %0, %2 \n"
" mts rmsr, %1 \n" " mts rmsr, %1 \n"
: "=r"(int_old_val), "=r"(tmp) : "=r"(state), "=r"(tmp)
: "i"(~MSR_IE) : "i"(~MSR_IE)
: "memory"); : "memory");
int_old_val &= MSR_IE; return state &= MSR_IE;
} }
#endif /* XPAR_MICROBLAZE_USE_MSR_INSTR */ #endif /* XPAR_MICROBLAZE_USE_MSR_INSTR */
void sys_irq_restore_enable(void) void sys_irq_restore_enable(unsigned int flags)
{ {
unsigned int tmp; unsigned int tmp;
@ -59,7 +59,7 @@ void sys_irq_restore_enable(void)
" or %0, %0, %1 \n" " or %0, %0, %1 \n"
" mts rmsr, %0 \n" " mts rmsr, %0 \n"
: "=r"(tmp) : "=r"(tmp)
: "r"(int_old_val) : "r"(~flags)
: "memory"); : "memory");
} }

View file

@ -47,12 +47,12 @@ struct metal_state {
/** /**
* @brief restore interrupts to state before disable_global_interrupt() * @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 * @brief disable all interrupts
*/ */
void sys_irq_save_disable(void); unsigned int sys_irq_save_disable(void);
#endif /* METAL_INTERNAL */ #endif /* METAL_INTERNAL */

View file

@ -14,13 +14,15 @@
#include <metal/utilities.h> #include <metal/utilities.h>
#include <stdint.h> #include <stdint.h>
void sys_irq_restore_enable(void) void sys_irq_restore_enable(unsigned int flags)
{ {
metal_unused(flags);
/* Add implementation here */ /* Add implementation here */
} }
void sys_irq_save_disable(void) unsigned int sys_irq_save_disable(void)
{ {
return 0;
/* Add implementation here */ /* Add implementation here */
} }

View file

@ -25,21 +25,19 @@
/* Mask off lower bits of addr */ /* Mask off lower bits of addr */
#define ARM_AR_MEM_TTB_SECT_SIZE_MASK (~(ARM_AR_MEM_TTB_SECT_SIZE-1UL)) #define ARM_AR_MEM_TTB_SECT_SIZE_MASK (~(ARM_AR_MEM_TTB_SECT_SIZE-1UL))
/* default value setting for disabling interrupts */ void sys_irq_restore_enable(unsigned int flags)
static unsigned int int_old_val = XIL_EXCEPTION_ALL;
void sys_irq_restore_enable(void)
{ {
Xil_ExceptionEnableMask(~int_old_val); Xil_ExceptionEnableMask(~flags);
} }
void sys_irq_save_disable(void) unsigned int sys_irq_save_disable(void)
{ {
int_old_val = mfcpsr() & XIL_EXCEPTION_ALL; unsigned int state = mfcpsr() & XIL_EXCEPTION_ALL;
if (XIL_EXCEPTION_ALL != int_old_val) { if (XIL_EXCEPTION_ALL != state) {
Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL); Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL);
} }
return state;
} }
void metal_machine_cache_flush(void *addr, unsigned int len) void metal_machine_cache_flush(void *addr, unsigned int len)

View file

@ -22,21 +22,19 @@
#define MB (1024 * 1024UL) #define MB (1024 * 1024UL)
#define GB (1024 * 1024 * 1024UL) #define GB (1024 * 1024 * 1024UL)
/* default value setting for disabling interrupts */ void sys_irq_restore_enable(unsigned int flags)
static unsigned int int_old_val = XIL_EXCEPTION_ALL;
void sys_irq_restore_enable(void)
{ {
Xil_ExceptionEnableMask(~int_old_val); Xil_ExceptionEnableMask(~flags);
} }
void sys_irq_save_disable(void) unsigned int sys_irq_save_disable(void)
{ {
int_old_val = mfcpsr() & XIL_EXCEPTION_ALL; unsigned int state = mfcpsr() & XIL_EXCEPTION_ALL;
if (XIL_EXCEPTION_ALL != int_old_val) { if (XIL_EXCEPTION_ALL != state) {
Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL); Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL);
} }
return state;
} }
void metal_machine_cache_flush(void *addr, unsigned int len) void metal_machine_cache_flush(void *addr, unsigned int len)

View file

@ -22,21 +22,19 @@
#define MPU_REGION_SIZE_MIN 0x20 #define MPU_REGION_SIZE_MIN 0x20
/* default value setting for disabling interrupts */ void sys_irq_restore_enable(unsigned int flags)
static unsigned int int_old_val = XIL_EXCEPTION_ALL;
void sys_irq_restore_enable(void)
{ {
Xil_ExceptionEnableMask(~int_old_val); Xil_ExceptionEnableMask(~flags);
} }
void sys_irq_save_disable(void) unsigned int sys_irq_save_disable(void)
{ {
int_old_val = mfcpsr() & XIL_EXCEPTION_ALL; unsigned int state = mfcpsr() & XIL_EXCEPTION_ALL;
if (XIL_EXCEPTION_ALL != int_old_val) { if (XIL_EXCEPTION_ALL != state) {
Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL); Xil_ExceptionDisableMask(XIL_EXCEPTION_ALL);
} }
return state;
} }
void metal_machine_cache_flush(void *addr, unsigned int len) void metal_machine_cache_flush(void *addr, unsigned int len)

View file

@ -430,7 +430,7 @@ static int metal_linux_dev_open(struct metal_bus *bus,
/* Reset device data. */ /* Reset device data. */
memset(ldev, 0, sizeof(*ldev)); memset(ldev, 0, sizeof(*ldev));
strncpy(ldev->dev_name, dev_name, sizeof(ldev->dev_name)); strncpy(ldev->dev_name, dev_name, sizeof(ldev->dev_name) - 1);
ldev->fd = -1; ldev->fd = -1;
ldev->ldrv = ldrv; ldev->ldrv = ldrv;
ldev->device.bus = bus; ldev->device.bus = bus;