From a4523e7561aa513a4063740b6ad786859aeb87c7 Mon Sep 17 00:00:00 2001 From: Eirik Nygaard Date: Thu, 2 Sep 2004 11:21:12 +0000 Subject: [PATCH] Redo the sysmsg test programs to match the changes done in the kernel to properly support synchronous and asynchronous syscall messages. --- test/sysmsg/Makefile | 6 +-- test/sysmsg/syscall.h | 100 +++++++++++++++++++++++++++++++++++++++ test/sysmsg/sysmsg1.c | 104 +++++++++++++++++++---------------------- test/sysmsg/sysmsg2.c | 106 +++++++++++++++++++----------------------- 4 files changed, 201 insertions(+), 115 deletions(-) create mode 100644 test/sysmsg/syscall.h diff --git a/test/sysmsg/Makefile b/test/sysmsg/Makefile index 49d346b92c..1a21977169 100644 --- a/test/sysmsg/Makefile +++ b/test/sysmsg/Makefile @@ -1,4 +1,4 @@ -# $DragonFly: src/test/sysmsg/Makefile,v 1.1 2003/08/12 02:29:41 dillon Exp $ +# $DragonFly: src/test/sysmsg/Makefile,v 1.2 2004/09/02 11:21:12 eirikn Exp $ # TARGETS=/tmp/sysmsg1 /tmp/sysmsg2 @@ -7,10 +7,10 @@ CFLAGS= -O2 -g -I/usr/src/sys all: $(TARGETS) -/tmp/sysmsg1: sysmsg1.c sendsys.h +/tmp/sysmsg1: sysmsg1.c syscall.h $(CC) $(CFLAGS) sysmsg1.c -o /tmp/sysmsg1 -/tmp/sysmsg2: sysmsg2.c sendsys.h +/tmp/sysmsg2: sysmsg2.c syscall.h $(CC) $(CFLAGS) sysmsg2.c -o /tmp/sysmsg2 clean: diff --git a/test/sysmsg/syscall.h b/test/sysmsg/syscall.h new file mode 100644 index 0000000000..5e1f28e70a --- /dev/null +++ b/test/sysmsg/syscall.h @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2004 Eirik Nygaard. 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 DragonFly Project 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 HOLDERS 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. + * + * $DragonFly: src/test/sysmsg/syscall.h,v 1.1 2004/09/02 11:21:12 eirikn Exp $ + */ + +/* XXX: eirik */ +#define _MMAP_DECLARED +#define _LSEEK_DECLARED +#define _TRUNCATE_DECLARED +#define _FTRUNCATE_DECLARED + +#define __syscall_args nosys_args + +#include +#include +#include +#include + +#include +#include + +#define INITMSGSYSCALL(name, flags) do { \ + bzero(&__CONCAT(name, msg), sizeof(__CONCAT(name, msg))); \ + (__CONCAT(name, msg)).usrmsg.umsg.ms_cmd.cm_op = \ + (__CONCAT(SYS_,name)); \ + (__CONCAT(name, msg)).usrmsg.umsg.ms_flags = (flags); \ +} while (0) + +#define DOMSGSYSCALL(name) do { \ + error = sendsys(NULL, &__CONCAT(name,msg).usrmsg, \ + sizeof(__CONCAT(name,msg))); \ +} while (0) + +#define FINISHMSGSYSCALL(name, error) do { \ + if (__CONCAT(name,msg).usrmsg.umsg.ms_error == EASYNC) { \ + for (;;) { \ + int rmsg; \ + rmsg = waitsys(NULL, (void *)error, 0); \ + if (error == rmsg) \ + break; \ + else if (rmsg != 0) { \ + errno = rmsg; \ + return(-1); \ + } \ + } \ + } \ + if (__CONCAT(name,msg).usrmsg.umsg.ms_error) { \ + errno = __CONCAT(name,msg).usrmsg.umsg.ms_error; \ + return(-1); \ + } \ + else \ + return(__CONCAT(name,msg).usrmsg.umsg.u.ms_result); \ +} while(0) + +static __inline int +sendsys(void *port, void *msg, int msgsize) +{ + int error; + + __asm __volatile("int $0x81" : "=a"(error), "=c"(msg), "=d"(msgsize) : + "0"(port), "1"(msg), "2"(msgsize) : "memory"); + return(error); +} + +static __inline int +waitsys(void *port, void *msg, int msgsize) +{ + int error; + + __asm __volatile("int $0x82" : "=a"(error), "=c"(msg), + "=d"(msgsize) : "0"(port), "1"(msg), "2"(msgsize) : + "memory"); + return(error); +} diff --git a/test/sysmsg/sysmsg1.c b/test/sysmsg/sysmsg1.c index 4505506295..b7bfd91ec3 100644 --- a/test/sysmsg/sysmsg1.c +++ b/test/sysmsg/sysmsg1.c @@ -1,67 +1,61 @@ /* * sysmsg1.c - * - * $DragonFly: src/test/sysmsg/sysmsg1.c,v 1.2 2004/06/03 21:03:32 dillon Exp $ + * + * $DragonFly: src/test/sysmsg/sysmsg1.c,v 1.3 2004/09/02 11:21:12 eirikn Exp $ */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include "sendsys.h" + +#include "syscall.h" + +__attribute__((weak)) int -main(int ac, char **av) +write_test(int fd, void * buf, size_t nbyte) { - struct write_args writemsg; - struct nanosleep_args sleepmsg; - struct timespec ts1; - struct timespec ts2; - int error; + struct write_args writemsg; + int error; - printf("synchronous sendsys() test: write 'hello!' and 1.5 second nanosleep\n"); - bzero(&writemsg, sizeof(writemsg)); - writemsg.usrmsg.umsg.ms_cmd.cm_op = SYS_write; - writemsg.usrmsg.umsg.ms_flags = 0; - writemsg.fd = 1; - writemsg.buf = "hello!\n"; - writemsg.nbyte = 7; - error = sendsys(NULL, &writemsg.usrmsg, sizeof(writemsg)); - printf("error code %d\n", error); - if (error != 0) - exit(1); + INITMSGSYSCALL(write, 0); + writemsg.fd = fd; + writemsg.buf = buf; + writemsg.nbyte = nbyte; + DOMSGSYSCALL(write); + printf("write: error: %d\n", error); + printf("write: ms_error: %d\n", writemsg.usrmsg.umsg.ms_error); + printf("write: ms_result: %d\n", writemsg.usrmsg.umsg.u.ms_result); + FINISHMSGSYSCALL(write, error); +} + +int +nanosleep_test(const struct timespec * rqtp, struct timespec * rmtp) +{ + struct nanosleep_args nanosleepmsg; + int error; - bzero(&sleepmsg, sizeof(sleepmsg)); - sleepmsg.usrmsg.umsg.ms_cmd.cm_op = SYS_nanosleep; - sleepmsg.usrmsg.umsg.ms_flags = 0; /* NOTE: not async */ - sleepmsg.rqtp = &ts1; - sleepmsg.rmtp = &ts2; - ts1.tv_sec = 1; - ts1.tv_nsec = 500 * 1000000; - error = sendsys(NULL, &sleepmsg.usrmsg, sizeof(sleepmsg)); - printf("error code %d\n", error); - if (error == EASYNC) { - struct nanosleep_args *rmsg; - printf("async return, waiting..."); - fflush(stdout); - for (;;) { - rmsg = (void *)sendsys(NULL, NULL, -1); - printf(" rmsg %p\n", rmsg); - if (rmsg == &sleepmsg) - break; - usleep(1000000 / 10); - } - printf("async return error %d\n", sleepmsg.usrmsg.umsg.ms_error); - } else if (error) { - printf("error %d\n", error); - } - exit(0); + INITMSGSYSCALL(nanosleep, 0); + nanosleepmsg.rqtp = rqtp; + nanosleepmsg.rmtp = rmtp; + DOMSGSYSCALL(nanosleep); + printf("nanosleep: error: %d\n", error); + printf("nanosleep: ms_error: %d\n", nanosleepmsg.usrmsg.umsg.ms_error); + printf("nanosleep: ms_result: %d\n", nanosleepmsg.usrmsg.umsg.u.ms_result); + FINISHMSGSYSCALL(nanosleep, error); } +int +main(void) +{ + struct timespec ts, ts2; + int error; + + printf("synchronous sendsys() test: write 'hello!' and 1.5 second nanosleep\n"); + error = write_test(1, "hello!\n", 7); + if (error == -1) + err(1, "write"); + ts.tv_sec = 1; + ts.tv_nsec = 500 * 1000000; + error = nanosleep_test(&ts, &ts2); + if (error == -1) + err(1, "nanosleep"); +} diff --git a/test/sysmsg/sysmsg2.c b/test/sysmsg/sysmsg2.c index 459ae61c91..cbc879fd07 100644 --- a/test/sysmsg/sysmsg2.c +++ b/test/sysmsg/sysmsg2.c @@ -1,71 +1,63 @@ /* * sysmsg2.c * - * $DragonFly: src/test/sysmsg/sysmsg2.c,v 1.2 2004/06/03 21:03:32 dillon Exp $ + * $DragonFly: src/test/sysmsg/sysmsg2.c,v 1.3 2004/09/02 11:21:12 eirikn Exp $ */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include "sendsys.h" + +#include "syscall.h" + +__attribute__((weak)) int -main(int ac, char **av) +write_test(int fd, void * buf, size_t nbyte) { - struct write_args writemsg; - struct nanosleep_args sleepmsg; - struct timespec ts1; - struct timespec ts2; - int error; - - printf("test synchronous syscall msg write 'hello!'\n"); - printf("test ASynchronous syscall msg nanosleep for 1.5 seconds\n"); - printf("WARNING! super-user only, do not ^C the test program!\n"); + struct write_args writemsg; + int error; - bzero(&writemsg, sizeof(writemsg)); - writemsg.usrmsg.umsg.ms_cmd.cm_op = SYS_write; - writemsg.usrmsg.umsg.ms_flags = 0; - writemsg.fd = 1; - writemsg.buf = "hello!\n"; - writemsg.nbyte = 7; - error = sendsys(NULL, &writemsg.usrmsg, sizeof(writemsg)); - printf("error code %d\n", error); - if (error != 0) - exit(1); + INITMSGSYSCALL(write, MSGF_ASYNC); + writemsg.fd = fd; + writemsg.buf = buf; + writemsg.nbyte = nbyte; + DOMSGSYSCALL(write); + printf("write: error: %d\n", error); + printf("write: ms_error: %d\n", writemsg.usrmsg.umsg.ms_error); + printf("write: ms_result: %d\n", writemsg.usrmsg.umsg.u.ms_result); + FINISHMSGSYSCALL(write, error); +} - bzero(&sleepmsg, sizeof(sleepmsg)); - sleepmsg.usrmsg.umsg.ms_cmd.cm_op = SYS_nanosleep; - sleepmsg.usrmsg.umsg.ms_flags = MSGF_ASYNC; - sleepmsg.rqtp = &ts1; - sleepmsg.rmtp = &ts2; - ts1.tv_sec = 1; - ts1.tv_nsec = 500 * 1000000; - error = sendsys(NULL, &sleepmsg.usrmsg, sizeof(sleepmsg)); - printf("error code %d\n", error); - if (error == EASYNC) { - struct nanosleep_args *rmsg; +int +nanosleep_test(const struct timespec * rqtp, struct timespec * rmtp) +{ + struct nanosleep_args nanosleepmsg; + int error; - printf("error %d is async return, waiting...", EASYNC); - fflush(stdout); - for (;;) { - rmsg = (void *)sendsys(NULL, NULL, -1); - printf(" rmsg %p\n", rmsg); - if (rmsg == &sleepmsg) - break; - usleep(1000000 / 10); - } - printf("async return error %d\n", sleepmsg.usrmsg.umsg.ms_error); - } else if (error) { - printf("error %d\n", error); - } - exit(0); + INITMSGSYSCALL(nanosleep, MSGF_ASYNC); + nanosleepmsg.rqtp = rqtp; + nanosleepmsg.rmtp = rmtp; + DOMSGSYSCALL(nanosleep); + printf("nanosleep: error: %d\n", error); + printf("nanosleep: ms_error: %d\n", nanosleepmsg.usrmsg.umsg.ms_error); + printf("nanosleep: ms_result: %d\n", nanosleepmsg.usrmsg.umsg.u.ms_result); + FINISHMSGSYSCALL(nanosleep, error); } +int +main(void) +{ + struct timespec ts, ts2; + int error; + + printf("test synchronous syscall msg write 'hello!', with async hint\n"); + printf("test ASynchronous syscall msg nanosleep for 1.5 seconds\n"); + printf("WARNING! super-user only, do not ^C the test program!\n"); + error = write_test(1, "hello!\n", 7); + if (error == -1) + err(1, "write"); + ts.tv_sec = 1; + ts.tv_nsec = 500 * 1000000; + error = nanosleep_test(&ts, &ts2); + if (error == -1) + err(1, "nanosleep"); +} -- 2.41.0