All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Leizhen (ThunderTown)" <thunder.leizhen@huawei.com>
To: Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
	x86l <x86@kernel.org>,
	Dominik Brodowski <linux@dominikbrodowski.net>,
	Andy Lutomirski <luto@kernel.org>,
	linux-kernel <linux-kernel@vger.kernel.org>
Cc: <yaomin2@huawei.com>
Subject: [Question] Can we use SIGRTMIN when vdso disabled on X86?
Date: Tue, 5 Jun 2018 19:24:46 +0800	[thread overview]
Message-ID: <5B1672FE.4050705@huawei.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 1092 bytes --]

After I executed "echo 0 > /proc/sys/abi/vsyscall32" to disable vdso, the rt_sigaction01 test case from ltp_2015 failed.
The test case source code please refer to the attachment, and the output as blow:

-----------------
./rt_sigaction01
rt_sigaction01    0  TINFO  :  signal: 34
rt_sigaction01    1  TPASS  :  rt_sigaction call succeeded: result = 0
rt_sigaction01    0  TINFO  :  sa.sa_flags = SA_RESETHAND|SA_SIGINFO
rt_sigaction01    0  TINFO  :  Signal Handler Called with signal number 34

Segmentation fault
------------------


Is this the desired result? In function ia32_setup_rt_frame, I found below code:

	if (ksig->ka.sa.sa_flags & SA_RESTORER)
		restorer = ksig->ka.sa.sa_restorer;
	else
		restorer = current->mm->context.vdso +
			vdso_image_32.sym___kernel_rt_sigreturn;
	put_user_ex(ptr_to_compat(restorer), &frame->pretcode);

Because the vdso is disabled, so current->mm->context.vdso is NULL, which cause the result of frame->pretcode invalid.

I'm not sure whether this is a kernel bug or just an error of test case itself. Can anyone help me?

-- 
Thanks!
BestRegards

[-- Attachment #2: rt_sigaction01.c --]
[-- Type: text/plain, Size: 4191 bytes --]

/******************************************************************************/
/* Copyright (c) Crackerjack Project., 2007                                   */
/*                                                                            */
/* This program is free software;  you can redistribute it and/or modify      */
/* it under the terms of the GNU General Public License as published by       */
/* the Free Software Foundation; either version 2 of the License, or          */
/* (at your option) any later version.                                        */
/*                                                                            */
/* This program is distributed in the hope that it will be useful,            */
/* but WITHOUT ANY WARRANTY;  without even the implied warranty of            */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See                  */
/* the GNU General Public License for more details.                           */
/*                                                                            */
/* You should have received a copy of the GNU General Public License          */
/* along with this program;  if not, write to the Free Software Foundation,   */
/* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA           */
/*                                                                            */
/* History:     Porting from Crackerjack to LTP is done by                    */
/*              Manas Kumar Nayak maknayak@in.ibm.com>                        */
/******************************************************************************/

/******************************************************************************/
/* Description: This tests the rt_sigaction() syscall                         */
/*		rt_sigaction alters an action taken by a process on receipt   */
/* 		of a particular signal. The action is specified by the        */
/*		sigaction structure. The previous action on the signal is     */
/*		saved in oact.sigsetsize should indicate the size of a        */
/*		sigset_t type.                       			      */
/******************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <sys/syscall.h>
#include <string.h>

#include "test.h"
#include "linux_syscall_numbers.h"
#include "lapi/rt_sigaction.h"

char *TCID = "rt_sigaction01";
static int testno;
int TST_TOTAL = 1;

static void cleanup(void)
{
	tst_rmdir();
}

static void setup(void)
{
	TEST_PAUSE;
	tst_tmpdir();
}

static int test_flags[] =
    { SA_RESETHAND | SA_SIGINFO, SA_RESETHAND, SA_RESETHAND | SA_SIGINFO,
SA_RESETHAND | SA_SIGINFO, SA_NOMASK };
char *test_flags_list[] =
    { "SA_RESETHAND|SA_SIGINFO", "SA_RESETHAND", "SA_RESETHAND|SA_SIGINFO",
"SA_RESETHAND|SA_SIGINFO", "SA_NOMASK" };

static void handler(int sig)
{
	tst_resm(TINFO, "Signal Handler Called with signal number %d\n", sig);
	return;
}

static int set_handler(int sig, int sig_to_mask, int mask_flags)
{
	struct sigaction sa, oldaction;

	sa.sa_handler = (void *)handler;
	sa.sa_flags = mask_flags;
	sigemptyset(&sa.sa_mask);
	sigaddset(&sa.sa_mask, sig);

	return ltp_rt_sigaction(sig, &sa, &oldaction, SIGSETSIZE);
}

int main(int ac, char **av)
{
	unsigned int flag;
	int signal;
	int lc;

	tst_parse_opts(ac, av, NULL, NULL);

	setup();

	for (lc = 0; TEST_LOOPING(lc); ++lc) {

		tst_count = 0;

		for (testno = 0; testno < TST_TOTAL; ++testno) {

			for (signal = SIGRTMIN; signal <= SIGRTMAX; signal++) {
				for (flag = 0;
				     flag <
				     (sizeof(test_flags) /
				      sizeof(test_flags[0])); flag++) {

					TEST(set_handler
					     (signal, 0, test_flags[flag]));

					if (TEST_RETURN == 0) {
						tst_resm(TINFO, "signal: %d ",
							 signal);
						tst_resm(TPASS,
							 "rt_sigaction call succeeded: result = %ld ",
							 TEST_RETURN);
						tst_resm(TINFO,
							 "sa.sa_flags = %s ",
							 test_flags_list[flag]);
						kill(getpid(), signal);
					} else {
						tst_resm(TFAIL | TTERRNO,
							 "rt_sigaction call "
							 "failed");
					}

				}

			}

		}

	}
	cleanup();
	tst_exit();
}

             reply	other threads:[~2018-06-05 11:27 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-05 11:24 Leizhen (ThunderTown) [this message]
2018-06-06  7:52 ` Is this a kernel BUG? ///Re: [Question] Can we use SIGRTMIN when vdso disabled on X86? Leizhen (ThunderTown)
2018-06-06  9:17   ` Leizhen (ThunderTown)
2018-06-06 17:01     ` Andy Lutomirski
2018-06-07  2:05       ` Leizhen (ThunderTown)
2018-06-07  2:39         ` Andy Lutomirski
2018-06-07  3:10           ` Leizhen (ThunderTown)
2018-06-06 17:48     ` hpa
2018-06-07  1:45       ` Leizhen (ThunderTown)
2018-06-07 21:05         ` H. Peter Anvin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5B1672FE.4050705@huawei.com \
    --to=thunder.leizhen@huawei.com \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@dominikbrodowski.net \
    --cc=luto@kernel.org \
    --cc=mingo@redhat.com \
    --cc=tglx@linutronix.de \
    --cc=x86@kernel.org \
    --cc=yaomin2@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.