[PATCH] Add libmetal memset_io and memcpy_io

90 views
Skip to first unread message

Wendy Liang

unread,
Aug 13, 2016, 2:32:26 AM8/13/16
to open...@googlegroups.com, Wendy Liang
The memcpy/memset may not work on device memory on some architecture,
as some architecture assumes the memcpy/memset will only access
aligned device memory address. We add memset_io and memcpy_io
to allow memset/memcpy unaligned device memory access.

Signed-off-by: Wendy Liang <jli...@xilinx.com>
---
lib/CMakeLists.txt | 1 +
lib/io.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
lib/io.h | 26 ++++++++++++++++++
3 files changed, 107 insertions(+)
create mode 100644 lib/io.c

diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
index 516afdc..48248f8 100644
--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -30,6 +30,7 @@ collect (PROJECT_LIB_SOURCES log.c)
collect (PROJECT_LIB_SOURCES shmem.c)
collect (PROJECT_LIB_SOURCES version.c)
collect (PROJECT_LIB_SOURCES dma.c)
+collect (PROJECT_LIB_SOURCES io.c)

add_subdirectory (compiler)
add_subdirectory (processor)
diff --git a/lib/io.c b/lib/io.c
new file mode 100644
index 0000000..817b302
--- /dev/null
+++ b/lib/io.c
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2015, Xilinx Inc. and Contributors. 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.
+ *
+ * 3. Neither the name of Xilinx nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * 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 HOLDER 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 "metal/io.h"
+
+void *metal_generic_memset_io(void *dst, int c, size_t size)
+{
+ void *retdst = dst;
+ unsigned int cint = (unsigned char)c;
+ unsigned int i;
+ for (i = 1; i < sizeof(int); i++)
+ cint |= (c << (8 * i));
+
+ for (; size && ((uintptr_t)dst % sizeof(int)); dst++, size--)
+ *(unsigned char volatile *)dst = (unsigned char) c;
+ for(; size >= sizeof(int); dst += sizeof(int), size -= sizeof(int))
+ *(unsigned int volatile *)dst = cint;
+ for(; size != 0; dst++, size--)
+ *(unsigned char volatile*)dst = (unsigned char) c;
+ return retdst;
+}
+
+void *metal_generic_memcpy_io(void *dst, const void *src, size_t size)
+{
+ void *retdst = dst;
+ while (size && (
+ ((uintptr_t)dst % sizeof(int)) ||
+ ((uintptr_t)src % sizeof(int)))) {
+ *(unsigned char volatile *)dst =
+ *(const unsigned char volatile *)src;
+ dst++;
+ src++;
+ size--;
+ }
+ for (; size >= sizeof(int);
+ dst += sizeof(int), src += sizeof(int), size -= sizeof(int))
+ *(unsigned int volatile *)dst =
+ *(const unsigned int volatile *)src;
+ for (; size != 0; dst++, src++, size--)
+ *(unsigned char volatile *)dst =
+ *(const unsigned char volatile *)src;
+ return retdst;
+}
+
+void *metal_memset_io(void *dst, int c, size_t size)
+{
+ return metal_generic_memset_io(dst, c, size);
+}
+
+void *metal_memcpy_io(void *dst, const void *src, size_t size)
+{
+ return metal_generic_memcpy_io(dst, src, size);
+}
diff --git a/lib/io.h b/lib/io.h
index badf84e..a0f8fcf 100644
--- a/lib/io.h
+++ b/lib/io.h
@@ -347,6 +347,32 @@ metal_io_write(struct metal_io_region *io, unsigned long offset,
void *metal_io_mem_map(metal_phys_addr_t pa,
struct metal_io_region *io,
size_t size);
+
+/**
+ * @brief libmetal set device memory
+ *
+ * This function is to fill the device memory with the specified value.
+ *
+ * @param[in] dst target memory
+ * @param[in] c val to fill
+ * @param[in] size size of memory to fill.
+ * @return pointer to the target memory
+ */
+void *metal_memset_io(void *dst, int c, size_t size);
+
+/**
+ * @brief libmetal copy to target memory
+ *
+ * This function is to copy specified memory area.
+ * The source memory or the destination memory can be device memory.
+ *
+ * @param[in] dst target memory
+ * @param[in] src source memory
+ * @param[in] size size of memory to copy.
+ * @return pointer to the target memory
+ */
+void *metal_memcpy_io(void *dst, const void *src, size_t size);
+
#ifdef __cplusplus
}
#endif
--
1.9.1

Wendy Liang

unread,
Aug 13, 2016, 2:33:25 AM8/13/16
to open...@googlegroups.com, Wendy Liang
Determine if list is empty by checking if list->next points
to list itself.

Signed-off-by: Wendy Liang <jli...@xilinx.com>
---
lib/list.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/list.h b/lib/list.h
index 0e726fb..b78c8d7 100644
--- a/lib/list.h
+++ b/lib/list.h
@@ -89,7 +89,7 @@ static inline void metal_list_add_tail(struct metal_list *list,

static inline int metal_list_is_empty(struct metal_list *list)
{
- return list->next == list->prev;
+ return list->next == list;
}

static inline void metal_list_del(struct metal_list *node)
--
1.9.1

Wendy Liang

unread,
Aug 13, 2016, 2:33:25 AM8/13/16
to open...@googlegroups.com, Sam Sortais
From: Sam Sortais <sam.s...@xilinx.com>

Signed-off-by: Sam Sortais <sam.s...@xilinx.com>
---
test/system/generic/irq.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/test/system/generic/irq.c b/test/system/generic/irq.c
index 2986f56..3a43b99 100644
--- a/test/system/generic/irq.c
+++ b/test/system/generic/irq.c
@@ -29,6 +29,7 @@
*/

#include <stdlib.h>
+#include <errno.h>

#include "metal-test.h"
#include "metal/irq.h"
@@ -73,7 +74,7 @@ static int irq(void)

metal_set_log_level(mll);
metal_log(LOG_DEBUG, "register irq %d fail hd %d\n", i, j);
- return rc;
+ return rc ? rc : -EINVAL;
}
}

--
1.9.1

Wendy Liang

unread,
Aug 13, 2016, 2:33:26 AM8/13/16
to open...@googlegroups.com, Sam Sortais
From: Sam Sortais <sam.s...@xilinx.com>

Signed-off-by: Sam Sortais <sam.s...@xilinx.com>
---
test/system/freertos/irq.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/test/system/freertos/irq.c b/test/system/freertos/irq.c
index 2986f56..3a43b99 100644
--- a/test/system/freertos/irq.c
+++ b/test/system/freertos/irq.c

Wendy Liang

unread,
Aug 13, 2016, 2:33:27 AM8/13/16
to open...@googlegroups.com, Sam Sortais
From: Sam Sortais <sam.s...@xilinx.com>

Signed-off-by: Sam Sortais <sam.s...@xilinx.com>
---
test/system/generic/main.c | 12 +++--
test/system/generic/zynq7/CMakeLists.txt | 2 +
test/system/generic/zynq7/helper.c | 80 +++++++++++++++++++++++++++
test/system/generic/zynqmp_r5/CMakeLists.txt | 2 +
test/system/generic/zynqmp_r5/helper.c | 81 ++++++++++++++++++++++++++++
5 files changed, 174 insertions(+), 3 deletions(-)
create mode 100644 test/system/generic/zynq7/helper.c
create mode 100644 test/system/generic/zynqmp_r5/helper.c

diff --git a/test/system/generic/main.c b/test/system/generic/main.c
index 46a2d6e..ce76ad5 100644
--- a/test/system/generic/main.c
+++ b/test/system/generic/main.c
@@ -30,11 +30,17 @@

#include "metal-test.h"

+extern int init_system(void);
+
int main(void)
{
- int status;
+ (void)init_system();
+ (void)metal_tests_run();

- status = metal_tests_run();
+ while (1) {
+ __asm__("wfi\n\t");
+ }

- return status;
+ /* will not return, but quiet the compiler */
+ return 0;
}
diff --git a/test/system/generic/zynq7/CMakeLists.txt b/test/system/generic/zynq7/CMakeLists.txt
index 77cb05e..8a3035e 100644
--- a/test/system/generic/zynq7/CMakeLists.txt
+++ b/test/system/generic/zynq7/CMakeLists.txt
@@ -1,3 +1,5 @@
+collect (PROJECT_LIB_TESTS helper.c)
+
set (_test_lib_external "xil")

collect (PROJECT_LIB_DEPS ${_test_lib_external})
diff --git a/test/system/generic/zynq7/helper.c b/test/system/generic/zynq7/helper.c
new file mode 100644
index 0000000..4119276
--- /dev/null
+++ b/test/system/generic/zynq7/helper.c
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2014, Mentor Graphics Corporation
+ * All rights reserved.
+ *
+ * Copyright (c) 2016 Xilinx, Inc. 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.
+ * 3. Neither the name of the <ORGANIZATION> nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * 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 HOLDER 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 "xscugic.h"
+
+#define INTC_DEVICE_ID XPAR_SCUGIC_0_DEVICE_ID
+
+static XScuGic xInterruptController;
+
+/* Interrupt Controller setup */
+static int app_gic_initialize(void)
+{
+ u32 Status;
+ XScuGic_Config *IntcConfig; /* The configuration parameters of the interrupt controller */
+
+ Xil_ExceptionDisable();
+
+ /*
+ * Initialize the interrupt controller driver
+ */
+ IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
+ if (NULL == IntcConfig) {
+ return XST_FAILURE;
+ }
+
+ Status = XScuGic_CfgInitialize(&xInterruptController, IntcConfig,
+ IntcConfig->CpuBaseAddress);
+ if (Status != XST_SUCCESS) {
+ return XST_FAILURE;
+ }
+
+ /*
+ * Register the interrupt handler to the hardware interrupt handling
+ * logic in the ARM processor.
+ */
+ Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT,
+ (Xil_ExceptionHandler)XScuGic_InterruptHandler,
+ &xInterruptController);
+
+ Xil_ExceptionEnable();
+
+ return 0;
+}
+
+/* Main hw machinery initialization entry point, called from main()*/
+/* return 0 on success */
+int init_system(void)
+{
+ /* configure the global interrupt controller */
+ app_gic_initialize();
+
+ return 0;
+}
diff --git a/test/system/generic/zynqmp_r5/CMakeLists.txt b/test/system/generic/zynqmp_r5/CMakeLists.txt
index f45421b..bd9f714 100644
--- a/test/system/generic/zynqmp_r5/CMakeLists.txt
+++ b/test/system/generic/zynqmp_r5/CMakeLists.txt
@@ -1,3 +1,5 @@
+collect (PROJECT_LIB_TESTS helper.c)
+
set (_test_lib_external "xil")

collect (PROJECT_LIB_DEPS ${_test_lib_external})
diff --git a/test/system/generic/zynqmp_r5/helper.c b/test/system/generic/zynqmp_r5/helper.c
new file mode 100644
index 0000000..90a7dcd
--- /dev/null
+++ b/test/system/generic/zynqmp_r5/helper.c
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2014, Mentor Graphics Corporation
+ * All rights reserved.
+ *
+ * Copyright (c) 2016 Xilinx, Inc. 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.
+ * 3. Neither the name of the <ORGANIZATION> nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * 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 HOLDER 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 "xscugic.h"
+
+
+#define INTC_DEVICE_ID XPAR_SCUGIC_0_DEVICE_ID
+
+static XScuGic xInterruptController;
+
+/* Interrupt Controller setup */
+static int app_gic_initialize(void)
+{
+ u32 Status;
+ XScuGic_Config *IntcConfig; /* The configuration parameters of the interrupt controller */
+
+ Xil_ExceptionDisable();
+
+ /*
+ * Initialize the interrupt controller driver
+ */
+ IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
+ if (NULL == IntcConfig) {
+ return XST_FAILURE;
+ }
+
+ Status = XScuGic_CfgInitialize(&xInterruptController, IntcConfig,
+ IntcConfig->CpuBaseAddress);
+ if (Status != XST_SUCCESS) {
+ return XST_FAILURE;
+ }
+
+ /*
+ * Register the interrupt handler to the hardware interrupt handling
+ * logic in the ARM processor.
+ */
+ Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT,
+ (Xil_ExceptionHandler)XScuGic_InterruptHandler,&xInterruptController);
+
+ Xil_ExceptionEnable();
+
+ return 0;
+}
+
+/* Main hw machinery initialization entry point, called from main()*/
+/* return 0 on success */
+int init_system(void)
+{
+ /* configure the global interrupt controller */
+ app_gic_initialize();
+
+ return 0;
+}
--
1.9.1

Wendy Liang

unread,
Aug 13, 2016, 2:33:27 AM8/13/16
to open...@googlegroups.com, Sam Sortais
From: Sam Sortais <sam.s...@xilinx.com>

Signed-off-by: Sam Sortais <sam.s...@xilinx.com>
---
lib/irq.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/irq.h b/lib/irq.h
index a493ef3..7167818 100644
--- a/lib/irq.h
+++ b/lib/irq.h
@@ -85,13 +85,13 @@ int metal_irq_register(int irq,
* @brief disable interrupts
* @return interrupts state
*/
-unsigned int metal_irq_save_disable();
+unsigned int metal_irq_save_disable(void);

/**
* @brief restore interrupts to their previous state
* @param[in] flags previous interrupts state
*/
-void metal_irq_restore_enable(unsigned flags);
+void metal_irq_restore_enable(unsigned int flags);

/**
* @brief metal_irq_enable
--
1.9.1

Wendy Liang

unread,
Aug 13, 2016, 2:38:56 AM8/13/16
to open...@googlegroups.com, Wendy Liang
The memcpy/memset may not work on device memory on some architecture,
as some architecture assumes the memcpy/memset will only access
aligned device memory address. We add memset_io and memcpy_io
to allow memset/memcpy unaligned device memory access.

Signed-off-by: Wendy Liang <jli...@xilinx.com>
---
lib/CMakeLists.txt | 1 +
lib/io.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
lib/io.h | 26 ++++++++++++++++++
3 files changed, 107 insertions(+)
create mode 100644 lib/io.c

diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
index 516afdc..48248f8 100644
--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -30,6 +30,7 @@ collect (PROJECT_LIB_SOURCES log.c)
collect (PROJECT_LIB_SOURCES shmem.c)
collect (PROJECT_LIB_SOURCES version.c)
collect (PROJECT_LIB_SOURCES dma.c)
+collect (PROJECT_LIB_SOURCES io.c)

add_subdirectory (compiler)
add_subdirectory (processor)
diff --git a/lib/io.c b/lib/io.c
new file mode 100644
index 0000000..817b302
--- /dev/null
+++ b/lib/io.c
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2015, Xilinx Inc. and Contributors. 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.
+ *
+ * 3. Neither the name of Xilinx nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * 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 HOLDER 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.
+ */
+
Reply all
Reply to author
Forward
0 new messages