Commit f5545b5c3a734e28647c0b591addb66535d5490d
1 parent
e1e3f30b
Translate whole of target_sigset. Use host sigset accessors.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4631 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
30 additions
and
38 deletions
linux-user/signal.c
@@ -125,30 +125,35 @@ int target_to_host_signal(int sig) | @@ -125,30 +125,35 @@ int target_to_host_signal(int sig) | ||
125 | return target_to_host_signal_table[sig]; | 125 | return target_to_host_signal_table[sig]; |
126 | } | 126 | } |
127 | 127 | ||
128 | +static inline void target_sigemptyset(target_sigset_t *set) | ||
129 | +{ | ||
130 | + memset(set, 0, sizeof(*set)); | ||
131 | +} | ||
132 | + | ||
133 | +static inline void target_sigaddset(target_sigset_t *set, int signum) | ||
134 | +{ | ||
135 | + signum--; | ||
136 | + abi_ulong mask = (abi_ulong)1 << (signum % TARGET_NSIG_BPW); | ||
137 | + set->sig[signum / TARGET_NSIG_BPW] |= mask; | ||
138 | +} | ||
139 | + | ||
140 | +static inline int target_sigismember(const target_sigset_t *set, int signum) | ||
141 | +{ | ||
142 | + signum--; | ||
143 | + abi_ulong mask = (abi_ulong)1 << (signum % TARGET_NSIG_BPW); | ||
144 | + return ((set->sig[signum / TARGET_NSIG_BPW] & mask) != 0); | ||
145 | +} | ||
146 | + | ||
128 | static void host_to_target_sigset_internal(target_sigset_t *d, | 147 | static void host_to_target_sigset_internal(target_sigset_t *d, |
129 | const sigset_t *s) | 148 | const sigset_t *s) |
130 | { | 149 | { |
131 | int i; | 150 | int i; |
132 | - unsigned long sigmask; | ||
133 | - uint32_t target_sigmask; | ||
134 | - | ||
135 | - sigmask = ((unsigned long *)s)[0]; | ||
136 | - target_sigmask = 0; | ||
137 | - for(i = 0; i < 32; i++) { | ||
138 | - if (sigmask & (1 << i)) | ||
139 | - target_sigmask |= 1 << (host_to_target_signal(i + 1) - 1); | ||
140 | - } | ||
141 | -#if TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 32 | ||
142 | - d->sig[0] = target_sigmask; | ||
143 | - for(i = 1;i < TARGET_NSIG_WORDS; i++) { | ||
144 | - d->sig[i] = ((unsigned long *)s)[i]; | 151 | + target_sigemptyset(d); |
152 | + for (i = 1; i <= TARGET_NSIG; i++) { | ||
153 | + if (sigismember(s, i)) { | ||
154 | + target_sigaddset(d, host_to_target_signal(i)); | ||
155 | + } | ||
145 | } | 156 | } |
146 | -#elif TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 64 && TARGET_NSIG_WORDS == 2 | ||
147 | - d->sig[0] = target_sigmask; | ||
148 | - d->sig[1] = sigmask >> 32; | ||
149 | -#else | ||
150 | - /* XXX: do it */ | ||
151 | -#endif | ||
152 | } | 157 | } |
153 | 158 | ||
154 | void host_to_target_sigset(target_sigset_t *d, const sigset_t *s) | 159 | void host_to_target_sigset(target_sigset_t *d, const sigset_t *s) |
@@ -164,25 +169,12 @@ void host_to_target_sigset(target_sigset_t *d, const sigset_t *s) | @@ -164,25 +169,12 @@ void host_to_target_sigset(target_sigset_t *d, const sigset_t *s) | ||
164 | void target_to_host_sigset_internal(sigset_t *d, const target_sigset_t *s) | 169 | void target_to_host_sigset_internal(sigset_t *d, const target_sigset_t *s) |
165 | { | 170 | { |
166 | int i; | 171 | int i; |
167 | - unsigned long sigmask; | ||
168 | - abi_ulong target_sigmask; | ||
169 | - | ||
170 | - target_sigmask = s->sig[0]; | ||
171 | - sigmask = 0; | ||
172 | - for(i = 0; i < 32; i++) { | ||
173 | - if (target_sigmask & (1 << i)) | ||
174 | - sigmask |= 1 << (target_to_host_signal(i + 1) - 1); | ||
175 | - } | ||
176 | -#if TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 32 | ||
177 | - ((unsigned long *)d)[0] = sigmask; | ||
178 | - for(i = 1;i < TARGET_NSIG_WORDS; i++) { | ||
179 | - ((unsigned long *)d)[i] = s->sig[i]; | ||
180 | - } | ||
181 | -#elif TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 64 && TARGET_NSIG_WORDS == 2 | ||
182 | - ((unsigned long *)d)[0] = sigmask | ((unsigned long)(s->sig[1]) << 32); | ||
183 | -#else | ||
184 | - /* XXX: do it */ | ||
185 | -#endif /* TARGET_ABI_BITS */ | 172 | + sigemptyset(d); |
173 | + for (i = 1; i <= TARGET_NSIG; i++) { | ||
174 | + if (target_sigismember(s, i)) { | ||
175 | + sigaddset(d, target_to_host_signal(i)); | ||
176 | + } | ||
177 | + } | ||
186 | } | 178 | } |
187 | 179 | ||
188 | void target_to_host_sigset(sigset_t *d, const target_sigset_t *s) | 180 | void target_to_host_sigset(sigset_t *d, const target_sigset_t *s) |