From: Real Name <enjoymindful@gmail.com>
To: Richard Weinberger <richard@nod.at>
Cc: user-mode-linux-user@lists.sourceforge.net,
user-mode-linux-devel@lists.sourceforge.net
Subject: Re: [uml-devel] [PATCH] remove csum_partial_copy_generic_i386 to clean up exception table
Date: Sat, 28 Jun 2014 12:06:28 +0800 [thread overview]
Message-ID: <20140628040628.GA23770@name> (raw)
In-Reply-To: <20140621072852.GA6538@name>
On Sat, Jun 21, 2014 at 03:28:52PM +0800, Real Name wrote:
> On Thu, Jun 05, 2014 at 11:49:49PM +0200, Richard Weinberger wrote:
> > Am 05.06.2014 06:15, schrieb Honggang Li:
> > > arch/x86/um/checksum_32.S had been copy & paste from x86. When build
> > > x86 uml, csum_partial_copy_generic_i386 mess up the exception table.
> > > In fact, exception table dose not work in uml kernel.
> >
> > Are you sure that exception tables do not work on UML?
> > I said, I'm not sure. Can you please find out?
>
> Hi,
> After traced i386 uml kernel with gdb , I'm sure exception tables
> do *not* work. When csum_partial_copy_generic_i386 read user space memory,
> an access error exception arises, however, the segv function always
> return zero. So, the fixup nerver executed. The uml system hang (not
> kernel panic).
The kernel hang because the SEGV signal handler can't modify the EIP
register in signal context.
Here is the summary why exception table dose not works for linux (>3.3):
1) broken exception table (706276543b699d80f546e45f8b12574e7b18d952)
2) arch_fixup modify the local copy of regs.
>
> thanks.
>
> >
> > In arch/um/kernel/trap.c:segv() we have the mechanism for it:
> > else if (!is_user && arch_fixup(ip, regs))
> > goto out;
0) access invalid memory address in kernel (no mm for the address. it is
easy to force invalid memory acess in kernel. I cast 0x1234 as a void
pointer, and pass it to csum_partial_copy_generic_i386)
1) SEGV signal arise
1.1) hard_handler (arch/um/os-Linux/signal.c)
The third argument of hard_handler point to signal context.
1.2) call sig_handler
1.3) call sig_handler_common (dump the registers in signal context into
local var struct uml_pt_regs r.). line 36 is the key point why
exception table dose not works in UML.
34 if (sig == SIGSEGV) {
35 /* For segfaults, we want the data from the sigcontext. */
36 get_regs_from_mc(&r, mc);
37 GET_FAULTINFO_FROM_MC(r.faultinfo, mc);
38
1.4) call segv_handler (arch/um/kernel/trap.c)
1.5) call segv
1.6) call arch_fixup (arch/x86/um/fault.c)
1.7) arch_fixup (UPT_IP(regs) = fixup->fixup;) set the EIP register of
local copy uml_pt_regs
1.8) When function return to sig_handler, the EIP change lost
1.9) When hard_handler signal handler return, it restore the EIP with
the address arise the SEGV in step 0. The fixup section never be
executed. If exception table works, UML kernel should run fixup code in
here.
Then repeate step 0 to 1.9, kernel hang on.
thanks
> >
> > The interesting question is, is this by design or was it just copy&pasted from x86
> > many moons ago? :)
> >
> > > And csum_partial_copy_generic_i386 never been called. So, delete it.
> >
> > I like such clean ups. :-)
> >
> > Thanks,
> > //richard
------------------------------------------------------------------------------
Open source business process management suite built on Java and Eclipse
Turn processes into business applications with Bonita BPM Community Edition
Quickly connect people, data, and systems into organized workflows
Winner of BOSSIE, CODIE, OW2 and Gartner awards
http://p.sf.net/sfu/Bonitasoft
_______________________________________________
User-mode-linux-devel mailing list
User-mode-linux-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel
next prev parent reply other threads:[~2014-06-28 4:06 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <538F275B.7000508@nod.at>
2014-06-05 4:15 ` [PATCH linux-next] remove csum_partial_copy_generic_i386 to clean up exception table Honggang Li
2014-06-05 4:15 ` [PATCH] " Honggang Li
2014-06-05 21:49 ` [uml-devel] " Richard Weinberger
2014-06-05 21:49 ` Richard Weinberger
2014-06-09 5:45 ` Real Name
2014-06-09 5:45 ` Real Name
2014-06-17 13:45 ` Real Name
2014-06-21 7:28 ` Real Name
2014-06-28 4:06 ` Real Name [this message]
2014-07-17 23:13 ` [uml-devel] " Real Name
2014-07-18 7:34 ` Richard Weinberger
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=20140628040628.GA23770@name \
--to=enjoymindful@gmail.com \
--cc=richard@nod.at \
--cc=user-mode-linux-devel@lists.sourceforge.net \
--cc=user-mode-linux-user@lists.sourceforge.net \
/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.