1 /* Scalar test for new spawn syscall available on Solaris 11. */ 2 3 #include "scalar.h" 4 5 #include <sys/spawn_impl.h> 6 7 __attribute__((noinline)) 8 static void sys_spawn(void) 9 { 10 GO(SYS_spawn, "5s 7m"); 11 SY(SYS_spawn, x0 + 1, x0 + 1, x0 - 1, x0 + 1, x0 - 1); FAIL; 12 } 13 14 __attribute__((noinline)) 15 static void sys_spawn2(void) 16 { 17 kspawn_attr_t ksa; 18 ksa.ksa_version = x0 + SPAWN_VERSION; 19 ksa.ksa_size = x0 + sizeof(ksa); 20 ksa.ksa_attr_off = x0 + 0; 21 ksa.ksa_path_off = x0 + 0; 22 ksa.ksa_shell_off = x0 + 0; 23 char *argenv = ""; 24 25 GO(SYS_spawn, "9s 1m"); 26 SY(SYS_spawn, x0 + 1, x0 + &ksa, sizeof(ksa), x0 + argenv, x0 + 1); FAIL; 27 } 28 29 __attribute__((noinline)) 30 static void sys_spawn3(void) 31 { 32 kspawn_attr_t ksa; 33 ksa.ksa_version = x0 + SPAWN_VERSION; 34 ksa.ksa_size = x0 + 0xbadcaffe; 35 ksa.ksa_attr_off = x0 + 0xbadcaffe; 36 ksa.ksa_attr_size = x0 + 1; 37 ksa.ksa_path_off = x0 + 0xdeadcaffe; 38 ksa.ksa_path_size = x0 + 2; 39 ksa.ksa_shell_off = x0 + 0xdeadcaffe; 40 ksa.ksa_shell_size = x0 + 3; 41 char *argenv = "\1arg1\0\1arg2\0\1arg3\0\0\1env1\0\1env2\0\0"; 42 43 GO(SYS_spawn, "13s 4m"); 44 SY(SYS_spawn, x0 + 1, x0 + &ksa, x0 + 0xbadcaffe, 45 x0 + argenv, x0 + sizeof(argenv)); FAIL; 46 } 47 48 __attribute__((noinline)) 49 static void sys_spawn4(void) 50 { 51 char path[] = "/bin/sh"; 52 char *argenv = "\2arg1\0\0"; 53 54 GO(SYS_spawn, "4s 0m"); 55 SY(SYS_spawn, path, x0, x0, x0 + argenv, x0 + sizeof(argenv)); 56 FAILx(EINVAL); 57 } 58 59 int main(void) 60 { 61 /* Uninitialised, but we know px[0] is 0x0. */ 62 long *px = malloc(sizeof(long)); 63 x0 = px[0]; 64 65 /* SYS_spawn 2 */ 66 sys_spawn(); 67 sys_spawn2(); 68 sys_spawn3(); 69 sys_spawn4(); 70 71 return 0; 72 } 73