blob: f59643d5bff190fd676c80ba44b6c6fc139f0691 [file] [log] [blame]
Dmitry V. Levin174bb2b2015-03-26 13:03:25 +00001#include "defs.h"
2#include "xlat/sigaltstack_flags.h"
3
4static void
5print_stack_t(struct tcb *tcp, unsigned long addr)
6{
7 stack_t ss;
Dmitry V. Levin174bb2b2015-03-26 13:03:25 +00008
9#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
10 if (current_wordsize != sizeof(ss.ss_sp) && current_wordsize == 4) {
11 struct {
12 uint32_t ss_sp;
13 int32_t ss_flags;
14 uint32_t ss_size;
15 } ss32;
Dmitry V. Levin401295e2015-07-17 01:05:46 +000016
17 if (umove_or_printaddr(tcp, addr, &ss32))
18 return;
19
20 memset(&ss, 0, sizeof(ss));
21 ss.ss_sp = (void*)(unsigned long) ss32.ss_sp;
22 ss.ss_flags = ss32.ss_flags;
23 ss.ss_size = (unsigned long) ss32.ss_size;
Dmitry V. Levin174bb2b2015-03-26 13:03:25 +000024 } else
25#endif
Dmitry V. Levin401295e2015-07-17 01:05:46 +000026 if (umove_or_printaddr(tcp, addr, &ss))
27 return;
28
29 tprints("{ss_sp=");
30 printaddr((unsigned long) ss.ss_sp);
31 tprints(", ss_flags=");
32 printflags(sigaltstack_flags, ss.ss_flags, "SS_???");
33 tprintf(", ss_size=%lu}", (unsigned long) ss.ss_size);
Dmitry V. Levin174bb2b2015-03-26 13:03:25 +000034}
35
Dmitry V. Levina0bd3742015-04-07 01:36:50 +000036SYS_FUNC(sigaltstack)
Dmitry V. Levin174bb2b2015-03-26 13:03:25 +000037{
38 if (entering(tcp)) {
39 print_stack_t(tcp, tcp->u_arg[0]);
Dmitry V. Levin174bb2b2015-03-26 13:03:25 +000040 tprints(", ");
Dmitry V. Levin401295e2015-07-17 01:05:46 +000041 } else {
Dmitry V. Levin174bb2b2015-03-26 13:03:25 +000042 print_stack_t(tcp, tcp->u_arg[1]);
43 }
44 return 0;
45}