Author: kib
Date: Wed Mar 30 14:46:12 2011
New Revision: 220158
URL: http://svn.freebsd.org/changeset/base/220158
Log:
Provide compat32 shims for kldstat(2).
Requested and tested by: jpaetzel
MFC after:1 week
Modified:
head/sys/compat/freebsd32/freebsd32.h
head/sys/compat/freebsd32/freebsd32_misc.c
head/sys/compat/freebsd32/syscalls.master
head/sys/kern/kern_linker.c
head/sys/sys/syscallsubr.h
Modified: head/sys/compat/freebsd32/freebsd32.h
==
--- head/sys/compat/freebsd32/freebsd32.h Wed Mar 30 14:15:18 2011
(r220157)
+++ head/sys/compat/freebsd32/freebsd32.h Wed Mar 30 14:46:12 2011
(r220158)
@@ -336,4 +336,23 @@ struct kinfo_proc32 {
int ki_tdflags;
};
+struct kld32_file_stat_1 {
+ int version;/* set to sizeof(struct kld_file_stat_1) */
+ charname[MAXPATHLEN];
+ int refs;
+ int id;
+ uint32_t address; /* load address */
+ uint32_t size; /* size in bytes */
+};
+
+struct kld32_file_stat {
+ int version;/* set to sizeof(struct kld_file_stat) */
+ charname[MAXPATHLEN];
+ int refs;
+ int id;
+ uint32_t address; /* load address */
+ uint32_t size; /* size in bytes */
+ charpathname[MAXPATHLEN];
+};
+
#endif /* !_COMPAT_FREEBSD32_FREEBSD32_H_ */
Modified: head/sys/compat/freebsd32/freebsd32_misc.c
==
--- head/sys/compat/freebsd32/freebsd32_misc.c Wed Mar 30 14:15:18 2011
(r220157)
+++ head/sys/compat/freebsd32/freebsd32_misc.c Wed Mar 30 14:46:12 2011
(r220158)
@@ -43,6 +43,7 @@ __FBSDID($FreeBSD$);
#include sys/jail.h
#include sys/kernel.h
#include sys/limits.h
+#include sys/linker.h
#include sys/lock.h
#include sys/malloc.h
#include sys/file.h /* Must come after sys/malloc.h */
@@ -2669,3 +2670,29 @@ freebsd32_copyout_strings(struct image_p
return ((register_t *)stack_base);
}
+int
+freebsd32_kldstat(struct thread *td, struct freebsd32_kldstat_args *uap)
+{
+ struct kld_file_stat stat;
+ struct kld32_file_stat stat32;
+ int error, version;
+
+ if ((error = copyin(uap-stat-version, version, sizeof(version)))
+ != 0)
+ return (error);
+ if (version != sizeof(struct kld32_file_stat_1)
+ version != sizeof(struct kld32_file_stat))
+ return (EINVAL);
+
+ error = kern_kldstat(td, uap-fileid, stat);
+ if (error != 0)
+ return (error);
+
+ bcopy(stat.name[0], stat32.name[0], sizeof(stat.name));
+ CP(stat, stat32, refs);
+ CP(stat, stat32, id);
+ PTROUT_CP(stat, stat32, address);
+ CP(stat, stat32, size);
+ bcopy(stat.pathname[0], stat32.pathname[0], sizeof(stat.pathname));
+ return (copyout(stat32, uap-stat, version));
+}
Modified: head/sys/compat/freebsd32/syscalls.master
==
--- head/sys/compat/freebsd32/syscalls.master Wed Mar 30 14:15:18 2011
(r220157)
+++ head/sys/compat/freebsd32/syscalls.master Wed Mar 30 14:46:12 2011
(r220158)
@@ -533,8 +533,8 @@
305AUE_MODUNLOAD NOPROTO { int kldunload(int fileid); }
306AUE_NULLNOPROTO { int kldfind(const char *file); }
307AUE_NULLNOPROTO { int kldnext(int fileid); }
-308AUE_NULLNOPROTO { int kldstat(int fileid, \
- struct kld_file_stat* stat); }
+308AUE_NULLSTD { int freebsd32_kldstat(int fileid, \
+ struct kld32_file_stat* stat); }
309AUE_NULLNOPROTO { int kldfirstmod(int fileid); }
310AUE_GETSID NOPROTO { int getsid(pid_t pid); }
311AUE_SETRESUID NOPROTO { int setresuid(uid_t ruid, uid_t euid, \
Modified: head/sys/kern/kern_linker.c
==
--- head/sys/kern/kern_linker.c Wed Mar 30 14:15:18 2011(r220157)
+++ head/sys/kern/kern_linker.c Wed Mar 30 14:46:12 2011(r220158)
@@ -1201,29 +1201,39 @@ int
kldstat(struct thread *td, struct kldstat_args *uap)
{
struct kld_file_stat stat;
- linker_file_t lf;
- int error, namelen, version, version_num;
+ int error, version;
/*
* Check the version of the user's structure.
*/
- if ((error = copyin(uap-stat-version, version, sizeof(version))) !=
0)
+ if ((error = copyin(uap-stat-version, version, sizeof(version)))
+ != 0)
return (error);
- if (version == sizeof(struct kld_file_stat_1))
- version_num = 1;
- else if (version == sizeof(struct kld_file_stat))
- version_num = 2;
- else
+ if