diff --git a/test/mng_mod/issues/925/arm64/CT_001.c b/test/mng_mod/issues/925/arm64/CT_001.c new file mode 100644 index 00000000..36950437 --- /dev/null +++ b/test/mng_mod/issues/925/arm64/CT_001.c @@ -0,0 +1,84 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_NAME "CT_001" +#define CHKANDJUMP(cond, ...) \ + do { \ + if (cond) { \ + fprintf(stderr, " [NG] "); \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, " failed\n"); \ + goto fn_fail; \ + } \ + } while(0); + +#define OKNG(cond, ...) \ + do { \ + if (cond) { \ + CHKANDJUMP(cond, __VA_ARGS__); \ + } else { \ + fprintf(stdout, " [OK] "); \ + fprintf(stdout, __VA_ARGS__); \ + fprintf(stdout, "\n"); \ + } \ + } while(0); + +#define TEST_VAL 0x1129 + +int main(int argc, char** argv) { + void *mem, *attach; + int rc = 0; + int status; + xpmem_segid_t segid; + xpmem_apid_t apid; + struct xpmem_addr addr; + const unsigned int page_size = sysconf(_SC_PAGESIZE); + + printf("*** %s start *******************************\n", TEST_NAME); + + mem = mmap(0, page_size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); + CHKANDJUMP(mem == NULL, "mmap"); + memset(mem, 0, page_size); + + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init"); + + segid = xpmem_make(mem, page_size, XPMEM_PERMIT_MODE, (void*)0666); + OKNG(segid == -1, "xpmem_make"); + + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + OKNG(apid == -1, "xpmem_get"); + + addr.apid = apid; + addr.offset = 0; + attach = xpmem_attach(addr, page_size, NULL); + OKNG(attach == (void*)-1, "xpmem_attach"); + + //*((unsigned long*)attach) = TEST_VAL; + + rc = xpmem_detach(attach); + OKNG(rc == -1, "xpmem_detach"); + + //OKNG(*((unsigned long*)mem) != TEST_VAL, "validate TEST_VAL"); + + rc = xpmem_remove(segid); + OKNG(rc == -1, "xpmem_remove"); + + printf("*** %s PASSED\n\n", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/925/arm64/CT_002.c b/test/mng_mod/issues/925/arm64/CT_002.c new file mode 100644 index 00000000..279d433c --- /dev/null +++ b/test/mng_mod/issues/925/arm64/CT_002.c @@ -0,0 +1,99 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_NAME "CT_002" +#define CHKANDJUMP(cond, ...) \ + do { \ + if (cond) { \ + fprintf(stderr, " [NG] "); \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, " failed\n"); \ + goto fn_fail; \ + } \ + } while(0); + +#define OKNG(cond, ...) \ + do { \ + if (cond) { \ + CHKANDJUMP(cond, __VA_ARGS__); \ + } else { \ + fprintf(stdout, " [OK] "); \ + fprintf(stdout, __VA_ARGS__); \ + fprintf(stdout, "\n"); \ + } \ + } while(0); + +#define TEST_VAL 0x1129 + +int main(int argc, char** argv) { + void *mem, *attach; + int rc = 0; + int status; + pid_t pid; + xpmem_segid_t segid; + xpmem_apid_t apid; + struct xpmem_addr addr; + const unsigned int page_size = sysconf(_SC_PAGESIZE); + + printf("*** %s start *******************************\n", TEST_NAME); + + mem = mmap(0, page_size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); + CHKANDJUMP(mem == NULL, "mmap"); + memset(mem, 0, page_size); + + fflush(0); + pid = fork(); + CHKANDJUMP(pid == -1, "fork failed\n"); + + if (pid == 0) { + /* Child process */ + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init in child"); + + segid = xpmem_make(mem, page_size, XPMEM_PERMIT_MODE, (void*)0666); + OKNG(segid == -1, "xpmem_make in child"); + + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + OKNG(apid == -1, "xpmem_get in child"); + + addr.apid = apid; + addr.offset = 0; + attach = xpmem_attach(addr, page_size, NULL); + OKNG(attach == (void*)-1, "xpmem_attach in child"); + + //*((unsigned long*)attach) = TEST_VAL; + + rc = xpmem_detach(attach); + OKNG(rc == -1, "xpmem_detach in child"); + + rc = xpmem_remove(segid); + OKNG(rc == -1, "xpmem_remove in child"); + + //OKNG(*((unsigned long*)mem) != TEST_VAL, "validate TEST_VAL"); + + fflush(0); + _exit(0); + } else { + /* Parent process */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid failed\n"); + } + + printf("*** %s PASSED\n\n", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/925/arm64/CT_003.c b/test/mng_mod/issues/925/arm64/CT_003.c new file mode 100644 index 00000000..e7c70241 --- /dev/null +++ b/test/mng_mod/issues/925/arm64/CT_003.c @@ -0,0 +1,99 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_NAME "CT_003" +#define CHKANDJUMP(cond, ...) \ + do { \ + if (cond) { \ + fprintf(stderr, " [NG] "); \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, " failed\n"); \ + goto fn_fail; \ + } \ + } while(0); + +#define OKNG(cond, ...) \ + do { \ + if (cond) { \ + CHKANDJUMP(cond, __VA_ARGS__); \ + } else { \ + fprintf(stdout, " [OK] "); \ + fprintf(stdout, __VA_ARGS__); \ + fprintf(stdout, "\n"); \ + } \ + } while(0); + +#define TEST_VAL 0x1129 + +int main(int argc, char** argv) { + void *mem, *attach; + int rc = 0; + int status; + pid_t pid; + xpmem_segid_t segid; + xpmem_apid_t apid; + struct xpmem_addr addr; + const unsigned int page_size = sysconf(_SC_PAGESIZE); + + printf("*** %s start *******************************\n", TEST_NAME); + + mem = mmap(0, page_size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); + CHKANDJUMP(mem == NULL, "mmap"); + memset(mem, 0, page_size); + + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init"); + + segid = xpmem_make(mem, page_size, XPMEM_PERMIT_MODE, (void*)0666); + OKNG(segid == -1, "xpmem_make"); + + fflush(0); + pid = fork(); + CHKANDJUMP(pid == -1, "fork failed\n"); + + if (pid == 0) { + /* Child process */ + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + OKNG(apid == -1, "xpmem_get in child"); + + addr.apid = apid; + addr.offset = 0; + attach = xpmem_attach(addr, page_size, NULL); + OKNG(attach == (void*)-1, "xpmem_attach in child"); + + *((unsigned long*)attach) = TEST_VAL; + + rc = xpmem_detach(attach); + OKNG(rc == -1, "xpmem_detach in child"); + + fflush(0); + _exit(0); + } else { + /* Parent process */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid failed\n"); + + OKNG(*((unsigned long*)mem) != TEST_VAL, "validate TEST_VAL"); + + rc = xpmem_remove(segid); + OKNG(rc == -1, "xpmem_remove"); + } + + printf("*** %s PASSED\n\n", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/925/arm64/CT_004.c b/test/mng_mod/issues/925/arm64/CT_004.c new file mode 100644 index 00000000..687c698a --- /dev/null +++ b/test/mng_mod/issues/925/arm64/CT_004.c @@ -0,0 +1,126 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_NAME "CT_004" +#define CHKANDJUMP(cond, ...) \ + do { \ + if (cond) { \ + fprintf(stderr, " [NG] "); \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, " failed\n"); \ + goto fn_fail; \ + } \ + } while(0); + +#define OKNG(cond, ...) \ + do { \ + if (cond) { \ + CHKANDJUMP(cond, __VA_ARGS__); \ + } else { \ + fprintf(stdout, " [OK] "); \ + fprintf(stdout, __VA_ARGS__); \ + fprintf(stdout, "\n"); \ + } \ + } while(0); + +#define TEST_VAL 0x1129 +#define BUFF_SIZE 1024 + +int main(int argc, char** argv) { + void *mem, *attach; + int rc = 0; + int status; + pid_t pid; + xpmem_segid_t segid; + xpmem_apid_t apid; + struct xpmem_addr addr; + key_t key = ftok(argv[0], 0); + int shmid; + const unsigned int page_size = sysconf(_SC_PAGESIZE); + + printf("*** %s start *******************************\n", TEST_NAME); + shmid = shmget(key, page_size, IPC_CREAT | 0660); + CHKANDJUMP(shmid == -1, "shmget"); + + mem = mmap(0, page_size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); + CHKANDJUMP(mem == NULL, "mmap"); + memset(mem, 0, page_size); + + fflush(0); + pid = fork(); + CHKANDJUMP(pid == -1, "fork failed\n"); + + if (pid == 0) { + /* Child process */ + void *shm = shmat(shmid, NULL, 0); + CHKANDJUMP(shm == (void*)-1, "shmat in child"); + + while ((segid = *(xpmem_segid_t*)shm) == 0) { }; + + rc = shmdt(shm); + CHKANDJUMP(rc == -1, "shmdt"); + + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init in child"); + + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + OKNG(apid == -1, "xpmem_get in child"); + + addr.apid = apid; + addr.offset = 0; + attach = xpmem_attach(addr, page_size, NULL); + OKNG(attach == (void*)-1, "xpmem_attach in child"); + + *((unsigned long*)attach) = TEST_VAL; + + rc = xpmem_detach(attach); + OKNG(rc == -1, "xpmem_detach in child"); + + fflush(0); + _exit(0); + } else { + /* Parent process */ + void *shm = shmat(shmid, NULL, 0); + CHKANDJUMP(shm == (void*)-1, "shmat in parent"); + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init"); + + segid = xpmem_make(mem, page_size, XPMEM_PERMIT_MODE, (void*)0666); + OKNG(segid == -1, "xpmem_make"); + + *(xpmem_segid_t*)shm = segid; + + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid failed\n"); + + OKNG(*((unsigned long*)mem) != TEST_VAL, "validate TEST_VAL"); + + struct shmid_ds buf; + rc = shmctl(shmid, IPC_RMID, &buf); + CHKANDJUMP(rc == -1, "shmctl"); + + rc = shmdt(shm); + CHKANDJUMP(rc == -1, "shmdt"); + + rc = xpmem_remove(segid); + OKNG(rc == -1, "xpmem_remove"); + } + + printf("*** %s PASSED\n\n", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/925/arm64/CT_005.c b/test/mng_mod/issues/925/arm64/CT_005.c new file mode 100644 index 00000000..2b9eee8e --- /dev/null +++ b/test/mng_mod/issues/925/arm64/CT_005.c @@ -0,0 +1,96 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_NAME "CT_005" +#define CHKANDJUMP(cond, ...) \ + do { \ + if (cond) { \ + fprintf(stderr, " [NG] "); \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, " failed\n"); \ + goto fn_fail; \ + } \ + } while(0); + +#define OKNG(cond, ...) \ + do { \ + if (cond) { \ + CHKANDJUMP(cond, __VA_ARGS__); \ + } else { \ + fprintf(stdout, " [OK] "); \ + fprintf(stdout, __VA_ARGS__); \ + fprintf(stdout, "\n"); \ + } \ + } while(0); + +#define TEST_VAL 0x1129 + +int main(int argc, char** argv) { + void *mem, *attach; + int rc = 0; + int status; + pid_t pid; + xpmem_segid_t segid; + xpmem_apid_t apid; + struct xpmem_addr addr; + const unsigned int page_size = sysconf(_SC_PAGESIZE); + + printf("*** %s start *******************************\n", TEST_NAME); + + mem = mmap(0, page_size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); + CHKANDJUMP(mem == NULL, "mmap"); + memset(mem, 0, page_size); + + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init"); + + segid = xpmem_make(mem, page_size, XPMEM_PERMIT_MODE, (void*)0666); + OKNG(segid == -1, "xpmem_make"); + + fflush(0); + pid = fork(); + CHKANDJUMP(pid == -1, "fork failed\n"); + + if (pid == 0) { + /* Child process */ + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + OKNG(apid == -1, "xpmem_get in child"); + + addr.apid = apid; + addr.offset = 0; + attach = xpmem_attach(addr, page_size, NULL); + OKNG(attach == (void*)-1, "xpmem_attach in child"); + + *((unsigned long*)attach) = TEST_VAL; + + fflush(0); + _exit(0); + } else { + /* Parent process */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid failed\n"); + + OKNG(*((unsigned long*)mem) != TEST_VAL, "validate TEST_VAL"); + + rc = xpmem_remove(segid); + OKNG(rc == -1, "xpmem_remove"); + } + + printf("*** %s PASSED\n\n", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/925/arm64/CT_006.c b/test/mng_mod/issues/925/arm64/CT_006.c new file mode 100644 index 00000000..b851bad3 --- /dev/null +++ b/test/mng_mod/issues/925/arm64/CT_006.c @@ -0,0 +1,83 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_NAME "CT_006" +#define CHKANDJUMP(cond, ...) \ + do { \ + if (cond) { \ + fprintf(stderr, " [NG] "); \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, " failed\n"); \ + goto fn_fail; \ + } \ + } while(0); + +#define OKNG(cond, ...) \ + do { \ + if (cond) { \ + CHKANDJUMP(cond, __VA_ARGS__); \ + } else { \ + fprintf(stdout, " [OK] "); \ + fprintf(stdout, __VA_ARGS__); \ + fprintf(stdout, "\n"); \ + } \ + } while(0); + +#define TEST_VAL 0x1129 + +int main(int argc, char** argv) { + void *mem, *attach; + int rc = 0; + int status; + pid_t pid; + xpmem_segid_t segid; + xpmem_apid_t apid; + struct xpmem_addr addr; + const unsigned int page_size = sysconf(_SC_PAGESIZE); + + printf("*** %s start *******************************\n", TEST_NAME); + + mem = mmap(0, page_size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); + CHKANDJUMP(mem == NULL, "mmap"); + memset(mem, 0, page_size); + + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init"); + + segid = xpmem_make(mem, page_size, XPMEM_PERMIT_MODE, (void*)0666); + OKNG(segid == -1, "xpmem_make"); + + fflush(0); + pid = fork(); + CHKANDJUMP(pid == -1, "fork failed\n"); + + if (pid == 0) { + /* Child process */ + sleep(1); /* wait for parent process exit */ + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + OKNG(apid != -1, "xpmem_get in child failed (parent process exited already"); + fflush(0); + + } else { + /* Parent process */ + _exit(0); + } + + printf("*** %s PASSED\n\n", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/925/arm64/CT_007.c b/test/mng_mod/issues/925/arm64/CT_007.c new file mode 100644 index 00000000..6808ce1a --- /dev/null +++ b/test/mng_mod/issues/925/arm64/CT_007.c @@ -0,0 +1,106 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_NAME "CT_007" +#define CHKANDJUMP(cond, ...) \ + do { \ + if (cond) { \ + fprintf(stderr, " [NG] "); \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, " failed\n"); \ + goto fn_fail; \ + } \ + } while(0); + +#define OKNG(cond, ...) \ + do { \ + if (cond) { \ + CHKANDJUMP(cond, __VA_ARGS__); \ + } else { \ + fprintf(stdout, " [OK] "); \ + fprintf(stdout, __VA_ARGS__); \ + fprintf(stdout, "\n"); \ + } \ + } while(0); + +#define TEST_VAL 0x1129 +#define BAD_ADDRESS (void*)-1 + +int main(int argc, char** argv) { + void *mem, *attach; + int rc = 0; + int status; + pid_t pid; + xpmem_segid_t segid; + xpmem_apid_t apid; + struct xpmem_addr addr; + const unsigned int page_size = sysconf(_SC_PAGESIZE); + + printf("*** %s start *******************************\n", TEST_NAME); + + mem = mmap(0, page_size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); + CHKANDJUMP(mem == NULL, "mmap"); + memset(mem, 0, page_size); + + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init"); + + segid = xpmem_make(BAD_ADDRESS, page_size, XPMEM_PERMIT_MODE, (void*)0666); + OKNG(segid != -1, "xpmem_make failed (invalid address)"); + + segid = xpmem_make(mem, page_size, XPMEM_PERMIT_MODE, (void*)0666); + CHKANDJUMP(segid == -1, "xpmem_make"); + + segid = xpmem_make(mem, page_size, XPMEM_PERMIT_MODE, (void*)0666); + OKNG(segid == -1, "xpmem_make succeed(do twice to same address)"); + + fflush(0); + pid = fork(); + CHKANDJUMP(pid == -1, "fork failed\n"); + + if (pid == 0) { + /* Child process */ + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + CHKANDJUMP(apid == -1, "xpmem_get in child"); + + addr.apid = apid; + addr.offset = 0; + attach = xpmem_attach(addr, page_size, NULL); + CHKANDJUMP(attach == (void*)-1, "xpmem_attach in child"); + + *((unsigned long*)attach) = TEST_VAL; + + rc = xpmem_detach(attach); + CHKANDJUMP(rc == -1, "xpmem_detach in child"); + + fflush(0); + _exit(0); + } else { + /* Parent process */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid failed\n"); + + CHKANDJUMP(*((unsigned long*)mem) != TEST_VAL, "validate TEST_VAL"); + + rc = xpmem_remove(segid); + CHKANDJUMP(rc == -1, "xpmem_remove"); + } + + printf("*** %s PASSED\n\n", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/925/arm64/CT_008.c b/test/mng_mod/issues/925/arm64/CT_008.c new file mode 100644 index 00000000..ff70b94d --- /dev/null +++ b/test/mng_mod/issues/925/arm64/CT_008.c @@ -0,0 +1,106 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_NAME "CT_008" +#define CHKANDJUMP(cond, ...) \ + do { \ + if (cond) { \ + fprintf(stderr, " [NG] "); \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, " failed\n"); \ + goto fn_fail; \ + } \ + } while(0); + +#define OKNG(cond, ...) \ + do { \ + if (cond) { \ + CHKANDJUMP(cond, __VA_ARGS__); \ + } else { \ + fprintf(stdout, " [OK] "); \ + fprintf(stdout, __VA_ARGS__); \ + fprintf(stdout, "\n"); \ + } \ + } while(0); + +#define TEST_VAL 0x1129 +#define BAD_SEGID -1 + +int main(int argc, char** argv) { + void *mem, *attach; + int rc = 0; + int status; + pid_t pid; + xpmem_segid_t segid; + xpmem_apid_t apid; + struct xpmem_addr addr; + const unsigned int page_size = sysconf(_SC_PAGESIZE); + + printf("*** %s start *******************************\n", TEST_NAME); + + mem = mmap(0, page_size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); + CHKANDJUMP(mem == NULL, "mmap"); + memset(mem, 0, page_size); + + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init"); + + segid = xpmem_make(mem, page_size, XPMEM_PERMIT_MODE, (void*)0666); + CHKANDJUMP(segid == -1, "xpmem_make"); + + fflush(0); + pid = fork(); + CHKANDJUMP(pid == -1, "fork failed\n"); + + if (pid == 0) { + /* Child process */ + apid = xpmem_get(BAD_SEGID, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + OKNG(apid != -1, "xpmem_get in child failed (invalid segid)"); + + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + CHKANDJUMP(apid == -1, "xpmem_get in child"); + + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + OKNG(apid == -1, "xpmem_get in child (do twice to same segid"); + + addr.apid = apid; + addr.offset = 0; + attach = xpmem_attach(addr, page_size, NULL); + CHKANDJUMP(attach == (void*)-1, "xpmem_attach in child"); + + *((unsigned long*)attach) = TEST_VAL; + + rc = xpmem_detach(attach); + CHKANDJUMP(rc == -1, "xpmem_detach in child"); + + fflush(0); + _exit(0); + } else { + /* Parent process */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid failed\n"); + + CHKANDJUMP(*((unsigned long*)mem) != TEST_VAL, "validate TEST_VAL"); + + rc = xpmem_remove(segid); + CHKANDJUMP(rc == -1, "xpmem_remove"); + } + + printf("*** %s PASSED\n\n", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/925/arm64/CT_009.c b/test/mng_mod/issues/925/arm64/CT_009.c new file mode 100644 index 00000000..e8f2563c --- /dev/null +++ b/test/mng_mod/issues/925/arm64/CT_009.c @@ -0,0 +1,109 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_NAME "CT_009" +#define CHKANDJUMP(cond, ...) \ + do { \ + if (cond) { \ + fprintf(stderr, " [NG] "); \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, " failed\n"); \ + goto fn_fail; \ + } \ + } while(0); + +#define OKNG(cond, ...) \ + do { \ + if (cond) { \ + CHKANDJUMP(cond, __VA_ARGS__); \ + } else { \ + fprintf(stdout, " [OK] "); \ + fprintf(stdout, __VA_ARGS__); \ + fprintf(stdout, "\n"); \ + } \ + } while(0); + +#define TEST_VAL 0x1129 + +int main(int argc, char** argv) { + void *mem, *attach; + int rc = 0; + int status; + pid_t pid; + xpmem_segid_t segid; + xpmem_apid_t apid; + struct xpmem_addr addr; + const unsigned int page_size = sysconf(_SC_PAGESIZE); + + printf("*** %s start *******************************\n", TEST_NAME); + + mem = mmap(0, page_size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); + CHKANDJUMP(mem == NULL, "mmap"); + memset(mem, 0, page_size); + + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init"); + + segid = xpmem_make(mem, page_size, XPMEM_PERMIT_MODE, (void*)0666); + CHKANDJUMP(segid == -1, "xpmem_make"); + + fflush(0); + pid = fork(); + CHKANDJUMP(pid == -1, "fork failed\n"); + + if (pid == 0) { + /* Child process */ + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + CHKANDJUMP(apid == -1, "xpmem_get in child"); + + addr.apid = -1; + addr.offset = 0; + attach = xpmem_attach(addr, page_size, NULL); + OKNG(attach != (void*)-1, "xpmem_attach in childi failed (invalid apid)"); + + addr.apid = apid; + addr.offset = 0; + attach = xpmem_attach(addr, page_size, NULL); + CHKANDJUMP(attach == (void*)-1, "xpmem_attach in child"); + + addr.apid = apid; + addr.offset = 0; + attach = xpmem_attach(addr, page_size, NULL); + OKNG(attach == (void*)-1, "xpmem_attach in child succeed (do twice to same apid)"); + + *((unsigned long*)attach) = TEST_VAL; + + rc = xpmem_detach(attach); + CHKANDJUMP(rc == -1, "xpmem_detach in child"); + + fflush(0); + _exit(0); + } else { + /* Parent process */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid failed\n"); + + CHKANDJUMP(*((unsigned long*)mem) != TEST_VAL, "validate TEST_VAL"); + + rc = xpmem_remove(segid); + CHKANDJUMP(rc == -1, "xpmem_remove"); + } + + printf("*** %s PASSED\n\n", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/925/arm64/CT_010.c b/test/mng_mod/issues/925/arm64/CT_010.c new file mode 100644 index 00000000..d6f3d916 --- /dev/null +++ b/test/mng_mod/issues/925/arm64/CT_010.c @@ -0,0 +1,106 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_NAME "CT_010" +#define CHKANDJUMP(cond, ...) \ + do { \ + if (cond) { \ + fprintf(stderr, " [NG] "); \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, " failed\n"); \ + goto fn_fail; \ + } \ + } while(0); + +#define OKNG(cond, ...) \ + do { \ + if (cond) { \ + CHKANDJUMP(cond, __VA_ARGS__); \ + } else { \ + fprintf(stdout, " [OK] "); \ + fprintf(stdout, __VA_ARGS__); \ + fprintf(stdout, "\n"); \ + } \ + } while(0); + +#define TEST_VAL 0x1129 +#define BAD_ADDRESS (void *) -1 + +int main(int argc, char** argv) { + void *mem, *attach; + int rc = 0; + int status; + pid_t pid; + xpmem_segid_t segid; + xpmem_apid_t apid; + struct xpmem_addr addr; + const unsigned int page_size = sysconf(_SC_PAGESIZE); + + printf("*** %s start *******************************\n", TEST_NAME); + + mem = mmap(0, page_size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); + CHKANDJUMP(mem == NULL, "mmap"); + memset(mem, 0, page_size); + + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init"); + + segid = xpmem_make(mem, page_size, XPMEM_PERMIT_MODE, (void*)0666); + CHKANDJUMP(segid == -1, "xpmem_make"); + + fflush(0); + pid = fork(); + CHKANDJUMP(pid == -1, "fork failed\n"); + + if (pid == 0) { + /* Child process */ + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + CHKANDJUMP(apid == -1, "xpmem_get in child"); + + addr.apid = apid; + addr.offset = 0; + attach = xpmem_attach(addr, page_size, NULL); + CHKANDJUMP(attach == (void*)-1, "xpmem_attach in child"); + + *((unsigned long*)attach) = TEST_VAL; + + rc = xpmem_detach(BAD_ADDRESS); + OKNG(rc == -1, "xpmem_detach in child succeed (invalid address)"); + + rc = xpmem_detach(attach); + CHKANDJUMP(rc == -1, "xpmem_detach in child"); + + rc = xpmem_detach(attach); + OKNG(rc == -1, "xpmem_detach in child succeed (do twice to same address)"); + + fflush(0); + _exit(0); + } else { + /* Parent process */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid failed\n"); + + CHKANDJUMP(*((unsigned long*)mem) != TEST_VAL, "validate TEST_VAL"); + + rc = xpmem_remove(segid); + CHKANDJUMP(rc == -1, "xpmem_remove"); + } + + printf("*** %s PASSED\n\n", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/925/arm64/CT_011.c b/test/mng_mod/issues/925/arm64/CT_011.c new file mode 100644 index 00000000..06f70248 --- /dev/null +++ b/test/mng_mod/issues/925/arm64/CT_011.c @@ -0,0 +1,106 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TEST_NAME "CT_011" +#define CHKANDJUMP(cond, ...) \ + do { \ + if (cond) { \ + fprintf(stderr, " [NG] "); \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, " failed\n"); \ + goto fn_fail; \ + } \ + } while(0); + +#define OKNG(cond, ...) \ + do { \ + if (cond) { \ + CHKANDJUMP(cond, __VA_ARGS__); \ + } else { \ + fprintf(stdout, " [OK] "); \ + fprintf(stdout, __VA_ARGS__); \ + fprintf(stdout, "\n"); \ + } \ + } while(0); + +#define TEST_VAL 0x1129 +#define BAD_SEGID -1 + +int main(int argc, char** argv) { + void *mem, *attach; + int rc = 0; + int status; + pid_t pid; + xpmem_segid_t segid; + xpmem_apid_t apid; + struct xpmem_addr addr; + const unsigned int page_size = sysconf(_SC_PAGESIZE); + + printf("*** %s start *******************************\n", TEST_NAME); + + mem = mmap(0, page_size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); + CHKANDJUMP(mem == NULL, "mmap"); + memset(mem, 0, page_size); + + rc = xpmem_init(); + CHKANDJUMP(rc != 0, "xpmem_init"); + + segid = xpmem_make(mem, page_size, XPMEM_PERMIT_MODE, (void*)0666); + CHKANDJUMP(segid == -1, "xpmem_make"); + + fflush(0); + pid = fork(); + CHKANDJUMP(pid == -1, "fork failed\n"); + + if (pid == 0) { + /* Child process */ + apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + CHKANDJUMP(apid == -1, "xpmem_get in child"); + + addr.apid = apid; + addr.offset = 0; + attach = xpmem_attach(addr, page_size, NULL); + CHKANDJUMP(attach == (void*)-1, "xpmem_attach in child"); + + *((unsigned long*)attach) = TEST_VAL; + + rc = xpmem_detach(attach); + CHKANDJUMP(rc == -1, "xpmem_detach in child"); + + fflush(0); + _exit(0); + } else { + /* Parent process */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid failed\n"); + + CHKANDJUMP(*((unsigned long*)mem) != TEST_VAL, "validate TEST_VAL"); + + rc = xpmem_remove(BAD_SEGID); + OKNG(rc != -1, "xpmem_remove failed (invalid segid)"); + + rc = xpmem_remove(segid); + CHKANDJUMP(rc == -1, "xpmem_remove"); + + rc = xpmem_remove(segid); + OKNG(rc != -1, "xpmem_remove failed (do twice to same segid)"); + } + + printf("*** %s PASSED\n\n", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/925/arm64/Makefile b/test/mng_mod/issues/925/arm64/Makefile new file mode 100644 index 00000000..e5881240 --- /dev/null +++ b/test/mng_mod/issues/925/arm64/Makefile @@ -0,0 +1,50 @@ +## Makefile COPYRIGHT FUJITSU LIMITED 2018 ## +CC = gcc +XPMEM_DIR= + +TARGET=CT_001 CT_002 CT_003 CT_004 CT_005 CT_006 CT_007 CT_008 CT_009 CT_010 CT_011 rusage012 + +CPPFLAGS = -I$(XPMEM_DIR)/include +LDFLAGS = -L$(XPMEM_DIR)/lib -lxpmem + +all: $(TARGET) + +CT_001: CT_001.c + $(CC) -o $@ $^ $(LDFLAGS) + +CT_002: CT_002.c + $(CC) -o $@ $^ $(LDFLAGS) + +CT_003: CT_003.c + $(CC) -o $@ $^ $(LDFLAGS) + +CT_004: CT_004.c + $(CC) -o $@ $^ $(LDFLAGS) + +CT_005: CT_005.c + $(CC) -o $@ $^ $(LDFLAGS) + +CT_006: CT_006.c + $(CC) -o $@ $^ $(LDFLAGS) + +CT_007: CT_007.c + $(CC) -o $@ $^ $(LDFLAGS) + +CT_008: CT_008.c + $(CC) -o $@ $^ $(LDFLAGS) + +CT_009: CT_009.c + $(CC) -o $@ $^ $(LDFLAGS) + +CT_010: CT_010.c + $(CC) -o $@ $^ $(LDFLAGS) + +CT_011: CT_011.c + $(CC) -o $@ $^ $(LDFLAGS) + +test: all + ./run.sh + +clean: + rm -f $(TARGET) *.o + diff --git a/test/mng_mod/issues/925/arm64/README b/test/mng_mod/issues/925/arm64/README new file mode 100644 index 00000000..4a712908 --- /dev/null +++ b/test/mng_mod/issues/925/arm64/README @@ -0,0 +1,99 @@ +/* README COPYRIGHT FUJITSU LIMITED 2018 */ + +XPMEM ドライバのfork()時の関連オブジェクトコピー機能テストセットREADME + +(1) テストの実行方法 + 以下の手順でテストを実行する + 1. $HOME/.mck_test_configを用意する + 当該ファイルは、McKernelをビルドした際に生成されるmck_test_config.sample ファイルを + $HOMEにコピーし、適宜編集する + 2. Makefileの変数XPMEM_DIRの内容を、XPMEMライブラリがインストールされているディレクトリに変更する + 3. XPMEMドライバをinsmodする + 4. make test を実行する + +(2) テスト項目詳細 +1. Issueで報告されたテストプログラムによる確認 + ISSUE01(rusage012) 親プロセス、子プロセスの間でxpmem領域への書き込み、参照が正しく行えること + ⇒ テストプログラム実行時に"1234"が出力され、且つ"xpmem_remove failed "が + 出力されなければOK + +2. McKernelでのXPMEM操作の基本動作確認 + CT_001: 単一プロセスでのXPMEM操作 + 1. 実行したプロセスがxpmem_make -> xpmem_get -> xpmem_attach -> xpmem_detach -> xpmem_remove + + CT_002: 子プロセスでのXPMEM操作 + 1. 親プロセスがfork() + 2. 子プロセスがxpmem_make -> xpmem_get -> xpmem_attach -> xpmem_detach ->xpmem_remove + 3. 子プロセス終了後、親プロセスが終了 + + CT_003: 親プロセスがmakeした共有領域への子プロセスによるXPMEM操作 + 1. 親プロセスがxpmem_make + 2. fork()で子プロセスを作成 + 3. 子プロセスで、xpmem_get -> xpmem_attach -> 値(TEST_VAL)の設定-> xpmem_detach + 4. 子プロセスが終了 + 5. 親プロセスが、子プロセスによって設定された値(TEST_VAL)を確認 + 6. 親プロセスがxpmem_remove + + CT_004: fork()後に親プロセスがmakeした共有領域への子プロセスによるXPMEM操作 + 1. fork()で子プロセスを作成 + 2. 親プロセスがxpmem_make + 3. 子プロセスで、xpmem_get -> xpmem_attach -> 値(TEST_VAL)の設定-> xpmem_detach + 4. 子プロセスが終了 + 5. 親プロセスが、子プロセスによって設定された値(TEST_VAL)を確認 + 6. 親プロセスがxpmem_remove + + CT_005: 子プロセスがxpmem_attach後、xpmem_detachをせずに終了 + 1. 親プロセスがxpmem_make + 2. fork()で子プロセスを作成 + 3. 子プロセスで、xpmem_get -> xpmem_attach + 4. 子プロセスが終了 + 5. 親プロセスがxpmem_remove + + CT_006: 子プロセスがXPMEM操作を行う時点で、xpmem_makeをした親プロセスが終了している + 1. 親プロセスがxpmem_make + 2. fork()で子プロセスを作成 + 3. 親プロセスが終了 + 4. 子プロセスで、xpmem_get (失敗) + 5. 子プロセスが終了 + + CT_007: xpmem_make 呼び出しの異常系 + 1. xpmem_make の第1引数に不正なアドレスを指定する(失敗) + 2. 1度xpmem_make を実施したメモリ領域に対して、再度xpmem_make を行う(成功) + + CT_008: xpmem_get 呼び出しの異常系 + 1. xpmem_get の第1引数に不正なsegidを指定する(失敗) + 2. 1度xpmem_get を実施したsegidで、再度xpmem_get を行う(成功) + + CT_009: xpmem_attach 呼び出しの異常系 + 1. xpmem_attach の第1引数に不正なapidを指定する(失敗) + 2. 1度xpmem_attach を実施したapidで、再度xpmem_attach を行う(成功) + + CT_010: xpmem_detach 呼び出しの異常系 + 1. xpmem_detach の第1引数に不正なアドレスを指定する(成功) + 2. 1度xpmem_detach を実施したメモリ領域に対して、再度xpmem_detach を行う(成功) + + CT_011: xpmem_remove 呼び出しの異常系 + 1. xpmem_remove の第1引数に不正なsegidを指定する(失敗) + 2. 1度xpmem_remove を実施したsegidで、再度xpmem_remove を行う(失敗) + + +(3) 実行結果ログ + result.logファイル内に実行時のログを記載する。 + 実行に利用したIHK/McKernelは、IA版における下記の版数相当の + arm64版移植IHK/McKernelである。 + + IHK + commit d6fcbee8cb91f9ec4b49f97c918e696ac0335aaf + Author: Shiratori, Takehiro + Date: Tue Oct 16 16:25:33 2018 +0900 + + McKernel + commit 6f9fef2b13447c74c36d15cf5ebd186f8395ccca + Author: Ken Sato + Date: Tue Sep 25 10:05:41 2018 +0900 + +(4) 備考 + 特になし。 + + +以上。 diff --git a/test/mng_mod/issues/925/arm64/result.log b/test/mng_mod/issues/925/arm64/result.log new file mode 100644 index 00000000..3dc2e6ce --- /dev/null +++ b/test/mng_mod/issues/925/arm64/result.log @@ -0,0 +1,88 @@ +gcc -o CT_001 CT_001.c -L/opt/xpmem/lib -lxpmem +gcc -o CT_002 CT_002.c -L/opt/xpmem/lib -lxpmem +gcc -o CT_003 CT_003.c -L/opt/xpmem/lib -lxpmem +gcc -o CT_004 CT_004.c -L/opt/xpmem/lib -lxpmem +gcc -o CT_005 CT_005.c -L/opt/xpmem/lib -lxpmem +gcc -o CT_006 CT_006.c -L/opt/xpmem/lib -lxpmem +gcc -o CT_007 CT_007.c -L/opt/xpmem/lib -lxpmem +gcc -o CT_008 CT_008.c -L/opt/xpmem/lib -lxpmem +gcc -o CT_009 CT_009.c -L/opt/xpmem/lib -lxpmem +gcc -o CT_010 CT_010.c -L/opt/xpmem/lib -lxpmem +gcc -o CT_011 CT_011.c -L/opt/xpmem/lib -lxpmem +gcc -I/opt/xpmem/include -L/opt/xpmem/lib -lxpmem rusage012.c -o rusage012 +./run.sh +mcstop+release.sh ... done +mcreboot.sh -c 4-7 -m 2G ... done +*** CT_001 start ******************************* + [OK] xpmem_make + [OK] xpmem_get + [OK] xpmem_attach + [OK] xpmem_detach + [OK] xpmem_remove +*** CT_001 PASSED + +*** CT_002 start ******************************* + [OK] xpmem_make in child + [OK] xpmem_get in child + [OK] xpmem_attach in child + [OK] xpmem_detach in child + [OK] xpmem_remove in child +*** CT_002 PASSED + +*** CT_003 start ******************************* + [OK] xpmem_make + [OK] xpmem_get in child + [OK] xpmem_attach in child + [OK] xpmem_detach in child + [OK] validate TEST_VAL + [OK] xpmem_remove +*** CT_003 PASSED + +*** CT_004 start ******************************* + [OK] xpmem_get in child + [OK] xpmem_attach in child + [OK] xpmem_detach in child + [OK] xpmem_make + [OK] validate TEST_VAL + [OK] xpmem_remove +*** CT_004 PASSED + +*** CT_005 start ******************************* + [OK] xpmem_make + [OK] xpmem_get in child + [OK] xpmem_attach in child + [OK] validate TEST_VAL + [OK] xpmem_remove +*** CT_005 PASSED + +*** CT_006 start ******************************* + [OK] xpmem_make + [OK] xpmem_get in child failed (parent process exited already +*** CT_006 PASSED + +*** CT_007 start ******************************* + [OK] xpmem_make failed (invalid address) + [OK] xpmem_make succeed(do twice to same address) +*** CT_007 PASSED + +*** CT_008 start ******************************* + [OK] xpmem_get in child failed (invalid segid) + [OK] xpmem_get in child (do twice to same segid +*** CT_008 PASSED + +*** CT_009 start ******************************* + [OK] xpmem_attach in childi failed (invalid apid) + [OK] xpmem_attach in child succeed (do twice to same apid) +*** CT_009 PASSED + +*** CT_010 start ******************************* + [OK] xpmem_detach in child succeed (invalid address) + [OK] xpmem_detach in child succeed (do twice to same address) +*** CT_010 PASSED + +*** CT_011 start ******************************* + [OK] xpmem_remove failed (invalid segid) + [OK] xpmem_remove failed (do twice to same segid) +*** CT_011 PASSED + +1234 diff --git a/test/mng_mod/issues/925/arm64/run.sh b/test/mng_mod/issues/925/arm64/run.sh new file mode 100755 index 00000000..2645633c --- /dev/null +++ b/test/mng_mod/issues/925/arm64/run.sh @@ -0,0 +1,22 @@ +#!/bin/sh +## run.sh COPYRIGHT FUJITSU LIMITED 2018 ## + +USELTP=0 +USEOSTEST=0 + +. ../../../../common.sh + +${MCEXEC} ./CT_001 +${MCEXEC} ./CT_002 +${MCEXEC} ./CT_003 +${MCEXEC} ./CT_004 +${MCEXEC} ./CT_005 +${MCEXEC} ./CT_006 +sleep 2 +${MCEXEC} ./CT_007 +${MCEXEC} ./CT_008 +${MCEXEC} ./CT_009 +${MCEXEC} ./CT_010 +${MCEXEC} ./CT_011 + +${MCEXEC} ./rusage012 diff --git a/test/mng_mod/issues/925/arm64/rusage012.c b/test/mng_mod/issues/925/arm64/rusage012.c new file mode 100644 index 00000000..80528fda --- /dev/null +++ b/test/mng_mod/issues/925/arm64/rusage012.c @@ -0,0 +1,107 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DEBUG + +#ifdef DEBUG +#define dprintf(...) \ + do { \ + char msg[1024]; \ + sprintf(msg, __VA_ARGS__); \ + fprintf(stderr, "%s,%s", __FUNCTION__, msg); \ + } while (0); +#define eprintf(...) \ + do { \ + char msg[1024]; \ + sprintf(msg, __VA_ARGS__); \ + fprintf(stderr, "%s,%s", __FUNCTION__, msg); \ + } while (0); +#else +#define dprintf(...) do { } while (0) +#define eprintf(...) do { } while (0) +#endif + +#define CHKANDJUMP(cond, err, ...) \ + do { \ + if(cond) { \ + eprintf(__VA_ARGS__); \ + ret = err; \ + goto fn_fail; \ + } \ + } while(0) + +#define CONFIG_64K_PAGE +#ifdef CONFIG_64K_PAGE +int sz_mem[] = { + (1ULL << 16), /* 64KiB */ + (1ULL << 25), /* 32MiB */ + (1ULL << 29), /* 512MiB */ + (1ULL << 27)}; /* 128MiB */ +#else /* CONFIG_4K_PAGE */ +int sz_mem[] = { + 4 * (1ULL<<10), /* 4096(4KiB) */ + 2 * (1ULL<<20), /* 2097152(2MiB) */ + 1 * (1ULL<<30), /* 1073741824(1GiB) */ + 134217728}; /* 128MiB */ +#endif + +#define SZ_INDEX 0 + +int main(int argc, char** argv) { + void* mem; + int ret = 0; + pid_t pid; + int status; + xpmem_segid_t segid; + + mem = mmap(0, sz_mem[SZ_INDEX], PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); + CHKANDJUMP(mem == MAP_FAILED, 255, "mmap failed\n"); + memset(mem, 0, sz_mem[SZ_INDEX]); + + ret = xpmem_init(); + CHKANDJUMP(ret != 0, 255, "xpmem_init failed: %s\n", strerror(errno)); + + segid = xpmem_make(mem, sz_mem[SZ_INDEX], XPMEM_PERMIT_MODE, (void*)0666); + CHKANDJUMP(segid == -1, 255, "xpmem_ioctl failed: %s\n", strerror(errno)); + + pid = fork(); + CHKANDJUMP(pid == -1, 255, "fork failed\n"); + if(pid == 0) { + xpmem_apid_t apid = xpmem_get(segid, XPMEM_RDWR, XPMEM_PERMIT_MODE, NULL); + CHKANDJUMP(apid == -1, 255, "xpmem_get failed: %s\n", strerror(errno)); + + struct xpmem_addr addr = { .apid = apid, .offset = 0 }; + void* attach = xpmem_attach(addr, sz_mem[SZ_INDEX], NULL); + CHKANDJUMP(attach == (void*)-1, 255, "xpmem_attach failed: %s\n", strerror(errno)); + + *((unsigned long*)attach) = 0x1234; + + ret = xpmem_detach(attach); + CHKANDJUMP(ret == -1, 255, "xpmem_detach failed\n"); + + _exit(123); + } else { + ret = waitpid(pid, &status, 0); + CHKANDJUMP(ret == -1, 255, "waitpid failed\n"); + + printf("%lx\n", *((unsigned long*)mem)); + + ret = xpmem_remove(segid); + CHKANDJUMP(ret == -1, 255, "xpmem_remove failed\n"); + } + + fn_exit: + return ret; + fn_fail: + goto fn_exit; +} diff --git a/test/mng_mod/issues/925/CT_001.c b/test/mng_mod/issues/925/x86_64/CT_001.c similarity index 100% rename from test/mng_mod/issues/925/CT_001.c rename to test/mng_mod/issues/925/x86_64/CT_001.c diff --git a/test/mng_mod/issues/925/CT_002.c b/test/mng_mod/issues/925/x86_64/CT_002.c similarity index 100% rename from test/mng_mod/issues/925/CT_002.c rename to test/mng_mod/issues/925/x86_64/CT_002.c diff --git a/test/mng_mod/issues/925/CT_003.c b/test/mng_mod/issues/925/x86_64/CT_003.c similarity index 100% rename from test/mng_mod/issues/925/CT_003.c rename to test/mng_mod/issues/925/x86_64/CT_003.c diff --git a/test/mng_mod/issues/925/CT_004.c b/test/mng_mod/issues/925/x86_64/CT_004.c similarity index 100% rename from test/mng_mod/issues/925/CT_004.c rename to test/mng_mod/issues/925/x86_64/CT_004.c diff --git a/test/mng_mod/issues/925/CT_005.c b/test/mng_mod/issues/925/x86_64/CT_005.c similarity index 100% rename from test/mng_mod/issues/925/CT_005.c rename to test/mng_mod/issues/925/x86_64/CT_005.c diff --git a/test/mng_mod/issues/925/CT_006.c b/test/mng_mod/issues/925/x86_64/CT_006.c similarity index 100% rename from test/mng_mod/issues/925/CT_006.c rename to test/mng_mod/issues/925/x86_64/CT_006.c diff --git a/test/mng_mod/issues/925/CT_007.c b/test/mng_mod/issues/925/x86_64/CT_007.c similarity index 100% rename from test/mng_mod/issues/925/CT_007.c rename to test/mng_mod/issues/925/x86_64/CT_007.c diff --git a/test/mng_mod/issues/925/CT_008.c b/test/mng_mod/issues/925/x86_64/CT_008.c similarity index 100% rename from test/mng_mod/issues/925/CT_008.c rename to test/mng_mod/issues/925/x86_64/CT_008.c diff --git a/test/mng_mod/issues/925/CT_009.c b/test/mng_mod/issues/925/x86_64/CT_009.c similarity index 100% rename from test/mng_mod/issues/925/CT_009.c rename to test/mng_mod/issues/925/x86_64/CT_009.c diff --git a/test/mng_mod/issues/925/CT_010.c b/test/mng_mod/issues/925/x86_64/CT_010.c similarity index 100% rename from test/mng_mod/issues/925/CT_010.c rename to test/mng_mod/issues/925/x86_64/CT_010.c diff --git a/test/mng_mod/issues/925/CT_011.c b/test/mng_mod/issues/925/x86_64/CT_011.c similarity index 100% rename from test/mng_mod/issues/925/CT_011.c rename to test/mng_mod/issues/925/x86_64/CT_011.c diff --git a/test/mng_mod/issues/925/Makefile b/test/mng_mod/issues/925/x86_64/Makefile similarity index 100% rename from test/mng_mod/issues/925/Makefile rename to test/mng_mod/issues/925/x86_64/Makefile diff --git a/test/mng_mod/issues/925/README b/test/mng_mod/issues/925/x86_64/README similarity index 100% rename from test/mng_mod/issues/925/README rename to test/mng_mod/issues/925/x86_64/README diff --git a/test/mng_mod/issues/925/result.log b/test/mng_mod/issues/925/x86_64/result.log similarity index 100% rename from test/mng_mod/issues/925/result.log rename to test/mng_mod/issues/925/x86_64/result.log