@@ -2138,6 +2138,31 @@ print_kill(const struct syscallname *name,
}
#endif
+#if defined(TARGET_NR_sysfs)
+static void
+print_sysfs(const struct syscallname *name,
+ abi_long arg0, abi_long arg1, abi_long arg2,
+ abi_long arg3, abi_long arg4, abi_long arg5)
+{
+ print_syscall_prologue(name);
+ switch (arg0) {
+ case 1:
+ print_raw_param("%d", arg0, 1);
+ print_string(arg1, 1);
+ break;
+ case 2:
+ print_raw_param("%d", arg0, 0);
+ print_raw_param("%u", arg1, 0);
+ print_pointer(arg2, 1);
+ break;
+ default:
+ print_raw_param("%d", arg0, 1);
+ break;
+ }
+ print_syscall_epilogue(name);
+}
+#endif
+
/*
* An array of all of the syscalls we know about
*/
@@ -1368,7 +1368,7 @@
{ TARGET_NR_sys_epoll_wait, "sys_epoll_wait" , NULL, NULL, NULL },
#endif
#ifdef TARGET_NR_sysfs
-{ TARGET_NR_sysfs, "sysfs" , NULL, NULL, NULL },
+{ TARGET_NR_sysfs, "sysfs" , NULL, print_sysfs, NULL },
#endif
#ifdef TARGET_NR_sysinfo
{ TARGET_NR_sysinfo, "sysinfo" , NULL, NULL, NULL },
@@ -9528,7 +9528,47 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
#endif
#ifdef TARGET_NR_sysfs
case TARGET_NR_sysfs:
- goto unimplemented;
+ switch (arg1) {
+ case 1:
+ {
+ if (arg2 != 0) {
+ p = lock_user_string(arg2);
+ if (!p) {
+ goto efault;
+ }
+ ret = get_errno(syscall(__NR_sysfs, arg1, p));
+ unlock_user(p, arg2, 0);
+ } else {
+ ret = get_errno(syscall(__NR_sysfs, arg1, NULL));
+ }
+ }
+ break;
+ case 2:
+ {
+ if (arg3 != 0) {
+ char buf[PATH_MAX];
+ int len;
+ memset(buf, 0, PATH_MAX);
+ ret = get_errno(syscall(__NR_sysfs, arg1, arg2, buf));
+ len = PATH_MAX;
+ if (len > strlen(buf)) {
+ len = strlen(buf);
+ }
+ if (copy_to_user(arg3, buf, len) != 0) {
+ goto efault;
+ }
+ } else {
+ ret = get_errno(syscall(__NR_sysfs, arg1, arg2, NULL));
+ }
+ }
+ break;
+ case 3:
+ ret = get_errno(syscall(__NR_sysfs, arg1));
+ break;
+ default:
+ ret = -EINVAL;
+ }
+ break;
#endif
case TARGET_NR_personality:
ret = get_errno(personality(arg1));