From: Aurelien Jarno <aurelien@aurel32.net>
To: Meador Inge <meadori@codesourcery.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v2] MIPS: Translate breaks and traps into the appropriate signal
Date: Mon, 4 Mar 2013 19:48:32 +0100 [thread overview]
Message-ID: <20130304184832.GC23040@ohm.aurel32.net> (raw)
In-Reply-To: <1357858222-12268-1-git-send-email-meadori@codesourcery.com>
On Thu, Jan 10, 2013 at 04:50:22PM -0600, Meador Inge wrote:
> GCC and GAS are capable of generating traps or breaks to check for
> division by zero. Additionally, GAS is capable of generating traps
> or breaks to check for overflow on certain division and multiplication
> operations. The Linux kernel translates these traps and breaks into
> signals. This patch implements the corresponding feature in QEMU.
>
> Signed-off-by: Meador Inge <meadori@codesourcery.com>
> ---
> Changes since v1:
>
> * Moved the BRK_* enumerations from target-mips/cpu.h to
> linux-user/main.c since they are only used in main.c
>
> * Fixed some style violations found by checkpatch.pl.
>
> * Removed a superfluous break.
>
> linux-user/main.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 75 insertions(+), 1 deletion(-)
>
> diff --git a/linux-user/main.c b/linux-user/main.c
> index 9ade1bf..583940c 100644
> --- a/linux-user/main.c
> +++ b/linux-user/main.c
> @@ -2182,6 +2182,33 @@ static int do_store_exclusive(CPUMIPSState *env)
> return segv;
> }
>
> +/* Break codes */
> +enum {
> + BRK_OVERFLOW = 6,
> + BRK_DIVZERO = 7
> +};
> +
> +static int do_break(CPUMIPSState *env, target_siginfo_t *info,
> + unsigned int code)
> +{
> + int ret = -1;
> +
> + switch (code) {
> + case BRK_OVERFLOW:
> + case BRK_DIVZERO:
> + info->si_signo = TARGET_SIGFPE;
> + info->si_errno = 0;
> + info->si_code = (code == BRK_OVERFLOW) ? FPE_INTOVF : FPE_INTDIV;
> + queue_signal(env, info->si_signo, &*info);
> + ret = 0;
> + break;
> + default:
> + break;
> + }
> +
> + return ret;
> +}
> +
> void cpu_loop(CPUMIPSState *env)
> {
> target_siginfo_t info;
> @@ -2297,8 +2324,55 @@ done_syscall:
> info.si_code = TARGET_ILL_ILLOPC;
> queue_signal(env, info.si_signo, &info);
> break;
> + /* The code below was inspired by the MIPS Linux kernel trap
> + * handling code in arch/mips/kernel/traps.c.
> + */
> + case EXCP_BREAK:
> + {
> + abi_ulong trap_instr;
> + unsigned int code;
> +
> + ret = get_user_ual(trap_instr, env->active_tc.PC);
> + if (ret != 0) {
> + goto error;
> + }
> +
> + /* As described in the original Linux kernel code, the
> + * below checks on 'code' are to work around an old
> + * assembly bug.
> + */
> + code = ((trap_instr >> 6) & ((1 << 20) - 1));
> + if (code >= (1 << 10)) {
> + code >>= 10;
> + }
> +
> + if (do_break(env, &info, code) != 0) {
> + goto error;
> + }
> + }
> + break;
> + case EXCP_TRAP:
> + {
> + abi_ulong trap_instr;
> + unsigned int code = 0;
> +
> + ret = get_user_ual(trap_instr, env->active_tc.PC);
> + if (ret != 0) {
> + goto error;
> + }
> +
> + /* The immediate versions don't provide a code. */
> + if (!(trap_instr & 0xFC000000)) {
> + code = ((trap_instr >> 6) & ((1 << 10) - 1));
> + }
> +
> + if (do_break(env, &info, code) != 0) {
> + goto error;
> + }
> + }
> + break;
> default:
> - // error:
> +error:
> fprintf(stderr, "qemu: unhandled CPU exception 0x%x - aborting\n",
> trapnr);
> cpu_dump_state(env, stderr, fprintf, 0);
Thanks, applied, and sorry for the delay.
--
Aurelien Jarno GPG: 1024D/F1BCDB73
aurelien@aurel32.net http://www.aurel32.net
prev parent reply other threads:[~2013-03-04 18:48 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-10 22:50 [Qemu-devel] [PATCH v2] MIPS: Translate breaks and traps into the appropriate signal Meador Inge
2013-03-04 18:48 ` Aurelien Jarno [this message]
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=20130304184832.GC23040@ohm.aurel32.net \
--to=aurelien@aurel32.net \
--cc=meadori@codesourcery.com \
--cc=qemu-devel@nongnu.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).