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
parent d3554a9e6a
commit ae6daa6207
27 changed files with 145 additions and 160 deletions

8
README
View File

@ -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:
@ -29,7 +27,7 @@ URL:
https://github.com/OpenAMP/libmetal
commit:
b4b5beab4b71388d63c732470b6d6da606ae8ffc
a4f763094cb26cd8f7abdff251f57a6a802c039d
Maintained-by:
External

View File

@ -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
@ -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 &&

View File

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

View File

@ -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.

View File

@ -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);
}
/**
@ -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);
}
/** @} */

View File

@ -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

View File

@ -1,3 +1,4 @@
add_subdirectory (gcc)
add_subdirectory (iar)
# 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,
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)
@ -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;
@ -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)
@ -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;
@ -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)

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);
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 */
@ -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);

View File

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

View File

@ -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)

View File

@ -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
@ -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

View File

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

View File

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

View File

@ -28,21 +28,19 @@
/* Mask off lower bits of addr */
#define ARM_AR_MEM_TTB_SECT_SIZE_MASK (~(ARM_AR_MEM_TTB_SECT_SIZE-1UL))
/* default value setting for disabling interrupts */
static unsigned int int_old_val = XIL_EXCEPTION_ALL;
void sys_irq_restore_enable(void)
void sys_irq_restore_enable(unsigned int flags)
{
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);
}
return state;
}
void metal_machine_cache_flush(void *addr, unsigned int len)

View File

@ -22,21 +22,19 @@
#define MB (1024 * 1024UL)
#define GB (1024 * 1024 * 1024UL)
/* default value setting for disabling interrupts */
static unsigned int int_old_val = XIL_EXCEPTION_ALL;
void sys_irq_restore_enable(void)
void sys_irq_restore_enable(unsigned int flags)
{
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);
}
return state;
}
void metal_machine_cache_flush(void *addr, unsigned int len)

View File

@ -22,21 +22,19 @@
#define MPU_REGION_SIZE_MIN 0x20
/* default value setting for disabling interrupts */
static unsigned int int_old_val = XIL_EXCEPTION_ALL;
void sys_irq_restore_enable(void)
void sys_irq_restore_enable(unsigned int flags)
{
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);
}
return state;
}
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)
{
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)

View File

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

View File

@ -47,12 +47,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 */

View File

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

View File

@ -25,21 +25,19 @@
/* Mask off lower bits of addr */
#define ARM_AR_MEM_TTB_SECT_SIZE_MASK (~(ARM_AR_MEM_TTB_SECT_SIZE-1UL))
/* default value setting for disabling interrupts */
static unsigned int int_old_val = XIL_EXCEPTION_ALL;
void sys_irq_restore_enable(void)
void sys_irq_restore_enable(unsigned int flags)
{
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);
}
return state;
}
void metal_machine_cache_flush(void *addr, unsigned int len)

View File

@ -22,21 +22,19 @@
#define MB (1024 * 1024UL)
#define GB (1024 * 1024 * 1024UL)
/* default value setting for disabling interrupts */
static unsigned int int_old_val = XIL_EXCEPTION_ALL;
void sys_irq_restore_enable(void)
void sys_irq_restore_enable(unsigned int flags)
{
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);
}
return state;
}
void metal_machine_cache_flush(void *addr, unsigned int len)

View File

@ -22,21 +22,19 @@
#define MPU_REGION_SIZE_MIN 0x20
/* default value setting for disabling interrupts */
static unsigned int int_old_val = XIL_EXCEPTION_ALL;
void sys_irq_restore_enable(void)
void sys_irq_restore_enable(unsigned int flags)
{
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);
}
return state;
}
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. */
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->ldrv = ldrv;
ldev->device.bus = bus;