/* Scalar test for new spawn syscall available on Solaris 11. */ #include "scalar.h" #include __attribute__((noinline)) static void sys_spawn(void) { GO(SYS_spawn, "5s 7m"); SY(SYS_spawn, x0 + 1, x0 + 1, x0 - 1, x0 + 1, x0 - 1); FAIL; } __attribute__((noinline)) static void sys_spawn2(void) { kspawn_attr_t ksa; ksa.ksa_version = x0 + SPAWN_VERSION; ksa.ksa_size = x0 + sizeof(ksa); ksa.ksa_attr_off = x0 + 0; ksa.ksa_path_off = x0 + 0; ksa.ksa_shell_off = x0 + 0; char *argenv = ""; GO(SYS_spawn, "9s 1m"); SY(SYS_spawn, x0 + 1, x0 + &ksa, sizeof(ksa), x0 + argenv, x0 + 1); FAIL; } __attribute__((noinline)) static void sys_spawn3(void) { kspawn_attr_t ksa; ksa.ksa_version = x0 + SPAWN_VERSION; ksa.ksa_size = x0 + 0xbadcaffe; ksa.ksa_attr_off = x0 + 0xbadcaffe; ksa.ksa_attr_size = x0 + 1; ksa.ksa_path_off = x0 + 0xdeadcaffe; ksa.ksa_path_size = x0 + 2; ksa.ksa_shell_off = x0 + 0xdeadcaffe; ksa.ksa_shell_size = x0 + 3; char *argenv = "\1arg1\0\1arg2\0\1arg3\0\0\1env1\0\1env2\0\0"; GO(SYS_spawn, "13s 4m"); SY(SYS_spawn, x0 + 1, x0 + &ksa, x0 + 0xbadcaffe, x0 + argenv, x0 + sizeof(argenv)); FAIL; } __attribute__((noinline)) static void sys_spawn4(void) { char path[] = "/bin/sh"; char *argenv = "\2arg1\0\0"; GO(SYS_spawn, "4s 0m"); SY(SYS_spawn, path, x0, x0, x0 + argenv, x0 + sizeof(argenv)); FAILx(EINVAL); } int main(void) { /* Uninitialised, but we know px[0] is 0x0. */ long *px = malloc(sizeof(long)); x0 = px[0]; /* SYS_spawn 2 */ sys_spawn(); sys_spawn2(); sys_spawn3(); sys_spawn4(); return 0; }