1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
# HG changeset patch
# User Bitbucket <noreply@bitbucket.org>
# Date 0 0
# Node ID 7ecd33d57049211e1084fc5e8bf588da49088d75
# Parent ce1acb28953fd6928ccb8f9511e374eab66e8625
# Parent 79bf8f58bec842a1aa94f4fff2e4884a6bb5378b
Merge preview of source (79bf8f58bec842a1aa94f4fff2e4884a6bb5378b) to destination (ce1acb28953fd6928ccb8f9511e374eab66e8625).
diff -r ce1acb28953fd6928ccb8f9511e374eab66e8625 -r 7ecd33d57049211e1084fc5e8bf588da49088d75 coregrind/m_syswrap/syswrap-freebsd.c
--- a/coregrind/m_syswrap/syswrap-freebsd.c
+++ b/coregrind/m_syswrap/syswrap-freebsd.c
@@ -1246,6 +1246,52 @@
POST_MEM_WRITE( ARG2, sizeof(struct vki_statfs6) );
}
+/* ---------------------------------------------------------------------
+ kld* wrappers
+ ------------------------------------------------------------------ */
+
+PRE(sys_kldload)
+{
+ PRINT("sys_kldload ( %#lx(%s) )", ARG1, (char *)ARG1);
+ PRE_REG_READ1(int, "kldload", const char *, "file");
+
+ PRE_MEM_RASCIIZ( "kldload(file)", ARG1 );
+}
+
+PRE(sys_kldunload)
+{
+ PRINT("sys_kldunload ( %ld )", ARG1);
+ PRE_REG_READ1(int, "kldunload", int, "fileid");
+}
+
+PRE(sys_kldfind)
+{
+ PRINT("sys_kldfind ( %#lx(%s) )", ARG1, (char *)ARG1);
+ PRE_REG_READ1(int, "kldfind", const char *, "file");
+
+ PRE_MEM_RASCIIZ( "kldfind(file)", ARG1 );
+}
+
+PRE(sys_kldnext)
+{
+ PRINT("sys_kldnext ( %ld )", ARG1);
+ PRE_REG_READ1(int, "kldnext", int, "fileid");
+}
+
+PRE(sys_kldsym)
+{
+ PRINT("sys_kldsym ( %ld, %ld, %#lx )", ARG1,ARG2,ARG3 );
+ PRE_REG_READ3(int, "kldsym", int, "fileid", int, "command", void*, "data");
+ PRE_MEM_READ( "kldsym(data)", ARG3, sizeof(struct vki_kld_sym_lookup) );
+ struct vki_kld_sym_lookup *kslp = (struct vki_kld_sym_lookup *)ARG3;
+ PRE_MEM_RASCIIZ( "kldsym(data.symname)", (Addr)kslp->symname );
+}
+POST(sys_kldsym)
+{
+ struct vki_kld_sym_lookup *kslp = (struct vki_kld_sym_lookup *)ARG3;
+ POST_MEM_WRITE( (Addr)&kslp->symvalue, sizeof(kslp->symvalue) );
+ POST_MEM_WRITE( (Addr)&kslp->symsize, sizeof(kslp->symsize) );
+}
#if 0
/* ---------------------------------------------------------------------
@@ -3389,14 +3435,14 @@
moans--;
VG_(message)(Vg_UserMsg,
"Warning: noted but unhandled ioctl 0x%lx"
- " with no size/direction hints",
+ " with no size/direction hints\n",
ARG2);
VG_(message)(Vg_UserMsg,
" This could cause spurious value errors"
- " to appear.");
+ " to appear.\n");
VG_(message)(Vg_UserMsg,
" See README_MISSING_SYSCALL_OR_IOCTL for "
- "guidance on writing a proper wrapper." );
+ "guidance on writing a proper wrapper.\n" );
}
} else {
if ((dir & _VKI_IOC_WRITE) && size > 0)
@@ -4054,10 +4100,10 @@
// BSDX_(__NR_modfnext, sys_modfnext), // 302
BSDX_(__NR_modfind, sys_modfind), // 303
-// BSDX_(__NR_kldload, sys_kldload), // 304
-// BSDX_(__NR_kldunload, sys_kldunload), // 305
-// BSDX_(__NR_kldfind, sys_kldfind), // 306
-// BSDX_(__NR_kldnext, sys_kldnext), // 307
+ BSDX_(__NR_kldload, sys_kldload), // 304
+ BSDX_(__NR_kldunload, sys_kldunload), // 305
+ BSDX_(__NR_kldfind, sys_kldfind), // 306
+ BSDX_(__NR_kldnext, sys_kldnext), // 307
// BSDXY(__NR_kldstat, sys_kldstat), // 308
// BSDX_(__NR_kldfirstmod, sys_kldfirstmod), // 309
@@ -4095,7 +4141,7 @@
BSDX_(__NR_utrace, sys_utrace), // 335
// compat3 sendfile 336
-// BSDXY(__NR_kldsym, sys_kldsym), // 337
+ BSDXY(__NR_kldsym, sys_kldsym), // 337
// BSDX_(__NR_jail, sys_jail), // 338
// unimpl pioctl 339
diff -r ce1acb28953fd6928ccb8f9511e374eab66e8625 -r 7ecd33d57049211e1084fc5e8bf588da49088d75 include/vki/vki-freebsd.h
--- a/include/vki/vki-freebsd.h
+++ b/include/vki/vki-freebsd.h
@@ -2129,6 +2129,17 @@
void *spare[3];
};
+//----------------------------------------------------------------------
+// From sys/linker.h
+//----------------------------------------------------------------------
+
+struct vki_kld_sym_lookup {
+ int version; /* set to sizeof(struct kld_sym_lookup) */
+ char *symname; /* Symbol name we are looking up */
+ unsigned long symvalue;
+ vki_size_t symsize;
+};
+
/*--------------------------------------------------------------------*/
/*--- end ---*/
/*--------------------------------------------------------------------*/
|