On Fri, 17 Dec 2010 10:38:06 +0100 Pierre Cassimans <cazz...@gmail.com> said:

> On 12/17/2010 07:06 AM, Carsten Haitzler (The Rasterman) wrote:
> > On Thu, 16 Dec 2010 20:29:58 +0100 Pierre Cassimans <cazz...@gmail.com>
> > said:
> > 
> > huh? that looks like this is doing unaligned stuff:
> > 
> >    params->y = TO_INT(ADD(want_y,
> >                           MUL(SUB(want_h, FROM_INT(params->h)),
> >                               desc->align.y)));
> > 
> > so we have:
> > 
> > TO_INT
> > ADD
> > MUL
> > SUB
> > FROM_INT
> > 
> > ie:
> > 
> > #define TO_INT(a) eina_f32p32_int_to(a)
> > #define ADD(a, b) eina_f32p32_add(a, b)
> > #define MUL(a, b) eina_f32p32_mul(a, b)
> > #define SUB(a, b) eina_f32p32_sub(a, b)
> > #define FROM_INT(a) eina_f32p32_int_from(a)
> > 
> > which are:
> > 
> > static inline int32_t
> > eina_f32p32_int_to(Eina_F32p32 v)
> > {
> >    return (int32_t)(v >> 32);
> > }
> > static inline Eina_F32p32
> > eina_f32p32_add(Eina_F32p32 a, Eina_F32p32 b)
> > {
> >    return a + b;
> > }
> > #define eina_fp32p32_llabs(a) ((a < 0) ? -(a) : (a))
> > static inline Eina_F32p32
> > eina_f32p32_mul(Eina_F32p32 a, Eina_F32p32 b)
> > {
> >    /* Prevent overflow and do '(a * b) >> 32' */
> >    /* Basically do: Eina_F16p16 * Eina_F16p16 = Eina_F32p32 */
> >    Eina_F32p32 up;
> >    Eina_F32p32 down;
> >    Eina_F32p32 result;
> >    uint64_t as, bs;
> >    Eina_F32p32 sign;
> > 
> >    sign = a ^ b;
> >    as = eina_fp32p32_llabs(a);
> >    bs = eina_fp32p32_llabs(b);
> > 
> >    up = (as >> 16) * (bs >> 16);
> >    down = (as & 0xFFFF) * (bs & 0xFFFF);
> > 
> >    result = up + (down >> 32);
> > 
> >    return sign < 0 ? - result : result;
> > }
> > static inline Eina_F32p32
> > eina_f32p32_sub(Eina_F32p32 a, Eina_F32p32 b)
> > {
> >    return a - b;
> > }
> > static inline Eina_F32p32
> > eina_f32p32_int_from(int32_t v)
> > {
> >    return (Eina_F32p32)(v) << 32;
> > }
> > 
> > that's been in edje for a long time - it's fixed point math.. now have a
> > look at that. nowhere there is it doing any "pointer funk" which would be a
> > cause for unaligned accesses. what looks wrong is the bt - func params
> > specifically look wrong. smells like something is inlined and gdb is
> > getting it wrong. but... for now lets assume that the fixed point math
> > above is what is triggering it... i dont see how. it's been there for ages.
> > i cant read/see a potential unaligned access. unless the source inputs like
> > params pointer is wrong or desc. they are pointing to unaligned data. i'd
> > find that most peculiar if they were.
> > 
> >> Hi,
> >>
> >> As told on IRC, when i run elementary_test, I get plenty of Alignment
> >> trap errors in dmesg. It also takes 3 minutes to start it up on an HP
> >> Ipaq h2200.
> >>
> >> I tried to debug the problem with gdb, and this is what I got. If not
> >> enough info please ask me for more. I'm ready to learn how to really
> >> give you good debug info :-)
> >>
> >> versions are all svn 54526
> >>
> >> Linux h2200 2.6.21-hh20 #1 PREEMPT Fri Dec 25 06:15:37 CET 2009 armv5tel
> >> unknown
> >>
> >> [ 3412.430000] Alignment trap: elementary_test (1341) PC=0x4042bbe0
> >> Instr=0xe1c581d0 Address=0x00140f64 FSR 0x013
> >>
> >> Program received signal SIGINT, Interrupt.
> >> _edje_part_recalc_single_aspect (ed=0x0, ep=0xfffffffb, desc=0x0,
> >>     chosen_desc=0x142614, rel1_to_x=0x57, rel1_to_y=0x0,
> >> rel2_to_x=0x4048df10,
> >>     rel2_to_y=0x2f6d6c65, confine_to=0x0, params=0x6574692f) at
> >> edje_calc.c:607
> >> 607        edje_calc.c: No such file or directory.
> >>    in edje_calc.c
> >>
> >> (gdb) l *0x04042bbe0
> >> 0x4042bbe0 is in _edje_part_recalc_single (edje_calc.c:604).
> >> 599        in edje_calc.c
> >>
> >> Hope this helps
> >>
> >>
> >> ------------------------------------------------------------------------------
> >> Lotusphere 2011
> >> Register now for Lotusphere 2011 and learn how
> >> to connect the dots, take your collaborative environment
> >> to the next level, and enter the era of Social Business.
> >> http://p.sf.net/sfu/lotusphere-d2d
> >> _______________________________________________
> >> enlightenment-devel mailing list
> >> enlightenment-devel@lists.sourceforge.net
> >> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
> >>
> > 
> > 
> 
> hmmm :-(
> 
> this is the procedure i follow to give the information:
> If I start gdb elementary_test, the program runs and gdb doesn't stop,
> but looking at dmesg i see the alignment traps happen.
> 
> So i
> - start elementary_test
> - start gdb
> - look to dmesg to get pid and address
> - attach <pid>
> - l *<address>
> 
> and then i get the output i gave you.
> 
> Is my procedure wrong? do I have to add something else?
> i always get the same output, except for the line numbers:
> <address> is in _edje_part_recalc_single (edje_calc.c:***).
> >> ***        in edje_calc.c

ooh.. wait.. you could be catching it at any point. no - you want to DISABLE
alignment fixups in your kernel to make sure elementary_test segv's on
unaligned access and have it running under gdb at the time.

-- 
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler)    ras...@rasterman.com


------------------------------------------------------------------------------
Lotusphere 2011
Register now for Lotusphere 2011 and learn how
to connect the dots, take your collaborative environment
to the next level, and enter the era of Social Business.
http://p.sf.net/sfu/lotusphere-d2d
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to