--- /dev/null
+#include <sys/socket.h>
+int main()
+{
+ struct sockaddr sa = {
+ .sa_family = (sa_family_t) -1,
+ .sa_data = 42,
+ };
+ bind(-1, &sa, sizeof(sa));
+ return 0;
+}
+
--- /dev/null
+set test "cast-user"
+set ::result_string {binary sa_family OK
+binary sa_data OK
+header sa_family OK
+header sa_data OK}
+
+set srcfile "$srcdir/$subdir/$test.c"
+set stpfile "$srcdir/$subdir/$test.stp"
+set exefile "[pwd]/$test.exe"
+set test_flags "additional_flags=-g"
+set res [target_compile "$srcfile" "$exefile" executable "$test_flags"]
+if { $res != "" } {
+ verbose "target_compile failed: $res" 2
+ fail "$test compile"
+ untested "$test"
+ return
+} else {
+ pass "$test compile"
+}
+
+stap_run3 $test "$stpfile" "$exefile" -c "$exefile"
--- /dev/null
+probe syscall.bind!, nd_syscall.bind
+{
+ if (pid() != target()) next
+
+ sa = my_addr_uaddr
+ family = 0xffff
+ data = 42
+
+ // Compare sa_family and sa_data using the target binary
+
+ cast_family = @cast(sa, "sockaddr", @1)->sa_family
+ if (family == cast_family)
+ println("binary sa_family OK")
+ else
+ printf("binary sa_family %#x != %#x\n", family, cast_family)
+
+ cast_data = @cast(sa, "sockaddr", @1)->sa_data[0]
+ if (data == cast_data)
+ println("binary sa_data OK")
+ else
+ printf("binary sa_data %d != %d\n", data, cast_data)
+
+ // Compare sa_family and sa_data using a generated user module
+
+ cast_family = @cast(sa, "sockaddr", "<sys/socket.h>")->sa_family
+ if (family == cast_family)
+ println("header sa_family OK")
+ else
+ printf("header sa_family %#x != %#x\n", family, cast_family)
+
+ cast_data = @cast(sa, "sockaddr", "<sys/socket.h>")->sa_data[0]
+ if (data == cast_data)
+ println("header sa_data OK")
+ else
+ printf("header sa_data %d != %d\n", data, cast_data)
+}
PID2 OK
PID3 OK
execname OK
-sa_data OK
usage OK}
-stap_run2 $srcdir/$subdir/$test.stp -g
+stap_run2 $srcdir/$subdir/$test.stp
else
printf("execname \"%s\" != \"%s\"\n", name, cast_name)
- // Compare sa_data using a generated user module
- data = 42
- cast_data = @cast(get_sockaddr(data), "sockaddr", "<sys/socket.h>")->sa_data[0]
- if (data == cast_data)
- println("sa_data OK")
- else
- printf("sa_data %d != %d\n", data, cast_data)
-
// Compare usage counter values through a struct address
usage = @cast(curr, "task_struct")->usage->counter
pusage = & @cast(curr, "task_struct")->usage
exit()
}
-
-%{
-#include <linux/socket.h>
-%}
-
-function get_sockaddr:long(data:long) %{
- static struct sockaddr sa = {0};
- sa.sa_data[0] = THIS->data;
- THIS->__retvalue = (long)&sa;
-%}