incubator-nuttx/openamp/0003-rpmsg-shouldn-t-alloca...

228 lines
8.7 KiB
Diff

From ca34df45f5d4893be223346b06cc75f370452386 Mon Sep 17 00:00:00 2001
From: Xiang Xiao <xiaoxiang@xiaomi.com>
Date: Fri, 24 Apr 2020 01:33:12 +0800
Subject: [PATCH 03/10] rpmsg: shouldn't allocate 0-1023 address in
rpmsg_create_ept
since this region is reserved for predefined services(e.g. NS use 0x35)
Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
---
apps/examples/echo/rpmsg-echo.c | 2 +-
apps/examples/echo/rpmsg-ping.c | 2 +-
.../matrix_multiply/matrix_multiply.c | 2 +-
.../matrix_multiply/matrix_multiplyd.c | 2 +-
apps/examples/rpc_demo/rpc_demod.c | 2 +-
.../rpmsg_sample_echo/rpmsg-sample-ping.c | 2 +-
apps/tests/msg/rpmsg-flood-ping.c | 2 +-
apps/tests/msg/rpmsg-ping.c | 2 +-
apps/tests/msg/rpmsg-update.c | 2 +-
lib/include/openamp/rpmsg.h | 27 ++++++++++---------
lib/rpmsg/rpmsg.c | 11 +++++---
11 files changed, 30 insertions(+), 26 deletions(-)
diff --git a/apps/examples/echo/rpmsg-echo.c open-amp/apps/examples/echo/rpmsg-echo.c
index 0c75203..71a0bbf 100644
--- a/apps/examples/echo/rpmsg-echo.c
+++ open-amp/apps/examples/echo/rpmsg-echo.c
@@ -58,7 +58,7 @@ int app(struct rpmsg_device *rdev, void *priv)
LPRINTF("Try to create rpmsg endpoint.\r\n");
ret = rpmsg_create_ept(&lept, rdev, RPMSG_SERVICE_NAME,
- 0, RPMSG_ADDR_ANY, rpmsg_endpoint_cb,
+ 1024, RPMSG_ADDR_ANY, rpmsg_endpoint_cb,
rpmsg_service_unbind);
if (ret) {
LPERROR("Failed to create endpoint.\r\n");
diff --git a/apps/examples/echo/rpmsg-ping.c open-amp/apps/examples/echo/rpmsg-ping.c
index 3b716b0..ff639cd 100644
--- a/apps/examples/echo/rpmsg-ping.c
+++ open-amp/apps/examples/echo/rpmsg-ping.c
@@ -11,7 +11,7 @@ This application echoes back data that was sent to it by the master core. */
#include "platform_info.h"
#include "rpmsg-echo.h"
-#define APP_EPT_ADDR 0
+#define APP_EPT_ADDR 1024
#define LPRINTF(format, ...) printf(format, ##__VA_ARGS__)
#define LPERROR(format, ...) LPRINTF("ERROR: " format, ##__VA_ARGS__)
diff --git a/apps/examples/matrix_multiply/matrix_multiply.c open-amp/apps/examples/matrix_multiply/matrix_multiply.c
index b9da29b..3928088 100644
--- a/apps/examples/matrix_multiply/matrix_multiply.c
+++ open-amp/apps/examples/matrix_multiply/matrix_multiply.c
@@ -14,7 +14,7 @@ multiplies them and returns the result to the master core. */
#define MAX_SIZE 6
#define NUM_MATRIX 2
-#define APP_EPT_ADDR 0
+#define APP_EPT_ADDR 1024
#define raw_printf(format, ...) printf(format, ##__VA_ARGS__)
#define LPRINTF(format, ...) raw_printf("CLIENT> " format, ##__VA_ARGS__)
diff --git a/apps/examples/matrix_multiply/matrix_multiplyd.c open-amp/apps/examples/matrix_multiply/matrix_multiplyd.c
index 6b4a118..29c6380 100644
--- a/apps/examples/matrix_multiply/matrix_multiplyd.c
+++ open-amp/apps/examples/matrix_multiply/matrix_multiplyd.c
@@ -92,7 +92,7 @@ int app(struct rpmsg_device *rdev, void *priv)
int ret;
ret = rpmsg_create_ept(&lept, rdev, RPMSG_SERVICE_NAME,
- 0, RPMSG_ADDR_ANY, rpmsg_endpoint_cb,
+ 1024, RPMSG_ADDR_ANY, rpmsg_endpoint_cb,
rpmsg_service_unbind);
if (ret) {
LPERROR("Failed to create endpoint.\r\n");
diff --git a/apps/examples/rpc_demo/rpc_demod.c open-amp/apps/examples/rpc_demo/rpc_demod.c
index 44c92a2..a4659f3 100644
--- a/apps/examples/rpc_demo/rpc_demod.c
+++ open-amp/apps/examples/rpc_demo/rpc_demod.c
@@ -312,7 +312,7 @@ int app(struct rpmsg_device *rdev, void *priv)
LPRINTF("Try to create rpmsg endpoint.\r\n");
ret = rpmsg_create_ept(&app_ept, rdev, RPMSG_SERVICE_NAME,
- 0, RPMSG_ADDR_ANY, rpmsg_endpoint_cb,
+ 1024, RPMSG_ADDR_ANY, rpmsg_endpoint_cb,
rpmsg_service_unbind);
if (ret) {
LPERROR("Failed to create endpoint.\r\n");
diff --git a/apps/examples/rpmsg_sample_echo/rpmsg-sample-ping.c open-amp/apps/examples/rpmsg_sample_echo/rpmsg-sample-ping.c
index ee866b4..14456e3 100644
--- a/apps/examples/rpmsg_sample_echo/rpmsg-sample-ping.c
+++ open-amp/apps/examples/rpmsg_sample_echo/rpmsg-sample-ping.c
@@ -20,7 +20,7 @@
#define BYE_MSG "goodbye!"
#define MSG_LIMIT 100
-#define APP_EPT_ADDR 0
+#define APP_EPT_ADDR 1024
#define LPRINTF(format, ...) printf(format, ##__VA_ARGS__)
#define LPERROR(format, ...) LPRINTF("ERROR: " format, ##__VA_ARGS__)
diff --git a/apps/tests/msg/rpmsg-flood-ping.c open-amp/apps/tests/msg/rpmsg-flood-ping.c
index 66489f8..28edc66 100644
--- a/apps/tests/msg/rpmsg-flood-ping.c
+++ open-amp/apps/tests/msg/rpmsg-flood-ping.c
@@ -12,7 +12,7 @@
#include "platform_info.h"
#include "rpmsg-ping.h"
-#define APP_EPT_ADDR 0
+#define APP_EPT_ADDR 1024
#define LPRINTF(format, ...) printf(format, ##__VA_ARGS__)
#define LPERROR(format, ...) LPRINTF("ERROR: " format, ##__VA_ARGS__)
diff --git a/apps/tests/msg/rpmsg-ping.c open-amp/apps/tests/msg/rpmsg-ping.c
index 0220a27..752b16c 100644
--- a/apps/tests/msg/rpmsg-ping.c
+++ open-amp/apps/tests/msg/rpmsg-ping.c
@@ -11,7 +11,7 @@ This application echoes back data that was sent to it by the master core. */
#include "platform_info.h"
#include "rpmsg-ping.h"
-#define APP_EPT_ADDR 0
+#define APP_EPT_ADDR 1024
#define LPRINTF(format, ...) printf(format, ##__VA_ARGS__)
#define LPERROR(format, ...) LPRINTF("ERROR: " format, ##__VA_ARGS__)
diff --git a/apps/tests/msg/rpmsg-update.c open-amp/apps/tests/msg/rpmsg-update.c
index 9b26cac..b8e08db 100644
--- a/apps/tests/msg/rpmsg-update.c
+++ open-amp/apps/tests/msg/rpmsg-update.c
@@ -73,7 +73,7 @@ int app(struct rpmsg_device *rdev, void *priv)
LPRINTF("Try to create rpmsg endpoint.\r\n");
ret = rpmsg_create_ept(&lept, rdev, RPMSG_SERVICE_NAME,
- 0, RPMSG_ADDR_ANY, rpmsg_endpoint_cb,
+ 1024, RPMSG_ADDR_ANY, rpmsg_endpoint_cb,
rpmsg_service_unbind);
if (ret) {
LPERROR("Failed to create endpoint.\r\n");
diff --git a/lib/include/openamp/rpmsg.h open-amp/lib/include/openamp/rpmsg.h
index a08f9d3..3403240 100644
--- a/lib/include/openamp/rpmsg.h
+++ open-amp/lib/include/openamp/rpmsg.h
@@ -25,22 +25,23 @@ extern "C" {
#endif
/* Configurable parameters */
-#define RPMSG_NAME_SIZE (32)
-#define RPMSG_ADDR_BMP_SIZE (128)
+#define RPMSG_NAME_SIZE (32)
+#define RPMSG_ADDR_BMP_SIZE (128)
-#define RPMSG_NS_EPT_ADDR (0x35)
-#define RPMSG_ADDR_ANY 0xFFFFFFFF
+#define RPMSG_NS_EPT_ADDR (0x35)
+#define RPMSG_RESERVED_ADDRESSES (1024)
+#define RPMSG_ADDR_ANY 0xFFFFFFFF
/* Error macros. */
-#define RPMSG_SUCCESS 0
-#define RPMSG_ERROR_BASE -2000
-#define RPMSG_ERR_NO_MEM (RPMSG_ERROR_BASE - 1)
-#define RPMSG_ERR_NO_BUFF (RPMSG_ERROR_BASE - 2)
-#define RPMSG_ERR_PARAM (RPMSG_ERROR_BASE - 3)
-#define RPMSG_ERR_DEV_STATE (RPMSG_ERROR_BASE - 4)
-#define RPMSG_ERR_BUFF_SIZE (RPMSG_ERROR_BASE - 5)
-#define RPMSG_ERR_INIT (RPMSG_ERROR_BASE - 6)
-#define RPMSG_ERR_ADDR (RPMSG_ERROR_BASE - 7)
+#define RPMSG_SUCCESS 0
+#define RPMSG_ERROR_BASE -2000
+#define RPMSG_ERR_NO_MEM (RPMSG_ERROR_BASE - 1)
+#define RPMSG_ERR_NO_BUFF (RPMSG_ERROR_BASE - 2)
+#define RPMSG_ERR_PARAM (RPMSG_ERROR_BASE - 3)
+#define RPMSG_ERR_DEV_STATE (RPMSG_ERROR_BASE - 4)
+#define RPMSG_ERR_BUFF_SIZE (RPMSG_ERROR_BASE - 5)
+#define RPMSG_ERR_INIT (RPMSG_ERROR_BASE - 6)
+#define RPMSG_ERR_ADDR (RPMSG_ERROR_BASE - 7)
struct rpmsg_endpoint;
struct rpmsg_device;
diff --git a/lib/rpmsg/rpmsg.c open-amp/lib/rpmsg/rpmsg.c
index eee1c28..dcc39c1 100644
--- a/lib/rpmsg/rpmsg.c
+++ open-amp/lib/rpmsg/rpmsg.c
@@ -29,7 +29,7 @@ static uint32_t rpmsg_get_address(unsigned long *bitmap, int size)
nextbit = metal_bitmap_next_clear_bit(bitmap, 0, size);
if (nextbit < (uint32_t)size) {
- addr = nextbit;
+ addr = RPMSG_RESERVED_ADDRESSES + nextbit;
metal_bitmap_set_bit(bitmap, nextbit);
}
@@ -48,7 +48,8 @@ static uint32_t rpmsg_get_address(unsigned long *bitmap, int size)
static void rpmsg_release_address(unsigned long *bitmap, int size,
int addr)
{
- if (addr < size)
+ addr -= RPMSG_RESERVED_ADDRESSES;
+ if (addr >= 0 && addr < size)
metal_bitmap_clear_bit(bitmap, addr);
}
@@ -65,7 +66,8 @@ static void rpmsg_release_address(unsigned long *bitmap, int size,
*/
static int rpmsg_is_address_set(unsigned long *bitmap, int size, int addr)
{
- if (addr < size)
+ addr -= RPMSG_RESERVED_ADDRESSES;
+ if (addr >= 0 && addr < size)
return metal_bitmap_is_bit_set(bitmap, addr);
else
return RPMSG_ERR_PARAM;
@@ -84,7 +86,8 @@ static int rpmsg_is_address_set(unsigned long *bitmap, int size, int addr)
*/
static int rpmsg_set_address(unsigned long *bitmap, int size, int addr)
{
- if (addr < size) {
+ addr -= RPMSG_RESERVED_ADDRESSES;
+ if (addr >= 0 && addr < size) {
metal_bitmap_set_bit(bitmap, addr);
return RPMSG_SUCCESS;
} else {
--
2.17.1