Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 3b3fcf36 in mainline for uspace/srv/test/ipc-test/main.c


Ignore:
Timestamp:
2018-11-20T10:53:13Z (3 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master
Children:
a615be0
Parents:
8be3230
git-author:
Jiri Svoboda <jiri@…> (2018-11-19 18:49:18)
git-committer:
Jiri Svoboda <jiri@…> (2018-11-20 10:53:13)
Message:

IPC share-in test using text and data segment.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/test/ipc-test/main.c

    r8be3230 r3b3fcf36  
    2727 */
    2828
     29/** @addtogroup ipc-test
     30 * @{
     31 */
     32/**
     33 * @file
     34 * @brief IPC test service
     35 *
     36 * If run as an initial task, this can be used to test sharing areas
     37 * backed by the ELF backend.
     38 */
     39
     40#include <as.h>
    2941#include <async.h>
    3042#include <errno.h>
    3143#include <str_error.h>
     44#include <io/log.h>
    3245#include <ipc/ipc_test.h>
    3346#include <ipc/services.h>
     
    4154static service_id_t svc_id;
    4255
     56/** Object in read-only memory area that will be shared.
     57 *
     58 * If the server is run as an initial task, the area should be backed
     59 * by ELF backend.
     60 */
     61static const char *ro_data = "Hello, world!";
     62
     63/** Object in read-write memory area that will be shared.
     64 *
     65 * If the server is run as an initial task, the area should be backed
     66 * by ELF backend.
     67 */
     68static char rw_data[] = "Hello, world!";
     69
     70static void ipc_test_get_ro_area_size_srv(ipc_call_t *icall)
     71{
     72        errno_t rc;
     73        as_area_info_t info;
     74
     75        log_msg(LOG_DEFAULT, LVL_DEBUG, "ipc_test_get_ro_area_size_srv");
     76
     77        rc = as_area_get_info((void *)ro_data, &info);
     78        if (rc != EOK) {
     79                async_answer_0(icall, EIO);
     80                log_msg(LOG_DEFAULT, LVL_ERROR, "as_area_get_info failed");
     81                return;
     82        }
     83
     84        async_answer_1(icall, EOK, info.size);
     85}
     86
     87static void ipc_test_get_rw_area_size_srv(ipc_call_t *icall)
     88{
     89        errno_t rc;
     90        as_area_info_t info;
     91
     92        log_msg(LOG_DEFAULT, LVL_DEBUG, "ipc_test_get_rw_area_size_srv");
     93
     94        rc = as_area_get_info(rw_data, &info);
     95        if (rc != EOK) {
     96                async_answer_0(icall, EIO);
     97                log_msg(LOG_DEFAULT, LVL_ERROR, "as_area_get_info failed");
     98                return;
     99        }
     100
     101        async_answer_1(icall, EOK, info.size);
     102}
     103
     104static void ipc_test_share_in_ro_srv(ipc_call_t *icall)
     105{
     106        ipc_call_t call;
     107        errno_t rc;
     108        size_t size;
     109        as_area_info_t info;
     110
     111        log_msg(LOG_DEFAULT, LVL_DEBUG, "ipc_test_share_in_ro_srv");
     112        if (!async_share_in_receive(&call, &size)) {
     113                async_answer_0(icall, EINVAL);
     114                log_msg(LOG_DEFAULT, LVL_ERROR, "share_in_receive failed");
     115                return;
     116        }
     117
     118        rc = as_area_get_info((void *)ro_data, &info);
     119        if (rc != EOK) {
     120                async_answer_0(icall, EINVAL);
     121                log_msg(LOG_DEFAULT, LVL_ERROR, "as_area_get_info failed");
     122                return;
     123        }
     124
     125        if (size != info.size) {
     126                log_msg(LOG_DEFAULT, LVL_ERROR, "size(%zu) != %zu",
     127                    size, info.size);
     128                async_answer_0(icall, EINVAL);
     129                return;
     130        }
     131
     132        rc = async_share_in_finalize(&call, (void *) info.start_addr,
     133            AS_AREA_READ);
     134        if (rc != EOK) {
     135                log_msg(LOG_DEFAULT, LVL_ERROR,
     136                    " - async_share_in_finalize failed");
     137                async_answer_0(icall, EINVAL);
     138                return;
     139        }
     140
     141        async_answer_0(icall, EOK);
     142}
     143
     144static void ipc_test_share_in_rw_srv(ipc_call_t *icall)
     145{
     146        ipc_call_t call;
     147        errno_t rc;
     148        size_t size;
     149        as_area_info_t info;
     150
     151        log_msg(LOG_DEFAULT, LVL_DEBUG, "ipc_test_share_in_ro_srv");
     152        if (!async_share_in_receive(&call, &size)) {
     153                async_answer_0(icall, EINVAL);
     154                log_msg(LOG_DEFAULT, LVL_ERROR, "share_in_receive failed");
     155                return;
     156        }
     157
     158        rc = as_area_get_info(rw_data, &info);
     159        if (rc != EOK) {
     160                async_answer_0(icall, EINVAL);
     161                log_msg(LOG_DEFAULT, LVL_ERROR, "as_area_get_info failed");
     162                return;
     163        }
     164
     165        if (size != info.size) {
     166                log_msg(LOG_DEFAULT, LVL_ERROR, " size(%zu) != %zu",
     167                    size, info.size);
     168                async_answer_0(icall, EINVAL);
     169                return;
     170        }
     171
     172        rc = async_share_in_finalize(&call, (void *) info.start_addr,
     173            AS_AREA_READ | AS_AREA_WRITE);
     174        if (rc != EOK) {
     175                log_msg(LOG_DEFAULT, LVL_ERROR,
     176                    "async_share_in_finalize failed");
     177                async_answer_0(icall, EINVAL);
     178                return;
     179        }
     180
     181        async_answer_0(icall, EOK);
     182}
     183
    43184static void ipc_test_connection(ipc_call_t *icall, void *arg)
    44185{
     
    59200                        async_answer_0(&call, EOK);
    60201                        break;
     202                case IPC_TEST_GET_RO_AREA_SIZE:
     203                        ipc_test_get_ro_area_size_srv(&call);
     204                        break;
     205                case IPC_TEST_GET_RW_AREA_SIZE:
     206                        ipc_test_get_rw_area_size_srv(&call);
     207                        break;
     208                case IPC_TEST_SHARE_IN_RO:
     209                        ipc_test_share_in_ro_srv(&call);
     210                        break;
     211                case IPC_TEST_SHARE_IN_RW:
     212                        ipc_test_share_in_rw_srv(&call);
     213                        break;
    61214                default:
    62215                        async_answer_0(&call, ENOTSUP);
     
    73226        async_set_fallback_port_handler(ipc_test_connection, NULL);
    74227
     228        rc = log_init(NAME);
     229        if (rc != EOK) {
     230                printf(NAME ": Failed to initialize log.\n");
     231                return rc;
     232        }
     233
    75234        rc = loc_server_register(NAME);
    76235        if (rc != EOK) {
    77                 printf("%s: Failed registering server. (%s)\n", NAME,
     236                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering server. (%s)\n",
    78237                    str_error(rc));
    79238                return rc;
     
    82241        rc = loc_service_register(SERVICE_NAME_IPC_TEST, &svc_id);
    83242        if (rc != EOK) {
    84                 printf("%s: Failed registering service. (%s)\n", NAME,
     243                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service. (%s)\n",
    85244                    str_error(rc));
    86245                return rc;
     
    94253        return 0;
    95254}
     255
     256/**
     257 * @}
     258 */
Note: See TracChangeset for help on using the changeset viewer.