This case comes from kernel which is non-shared. It seems there is no
other solutions except always addressing the preemptable variables by
symbol name instead of the base + offset.

2011/11/11 Sun Chan <sun.c...@gmail.com>:
> your change adds check for preemption outside of shared and call shared. In
> the case of "non_shared", this does not make sense since preemption is
> always in the context of dynamic objects.
> Sun
>
> On Fri, Nov 11, 2011 at 6:01 PM, 朱庆 <zqing1...@gmail.com> wrote:
>>
>> Hi all,
>>
>> Can gatekeeper help review for a fix for bug848?
>> https://bugs.open64.net/show_bug.cgi?id=848
>>
>> Case:
>> $cat timer.c
>> #include <stdio.h>
>> extern unsigned long long __attribute__((section(".data"))) jiffies_64;
>> extern unsigned long volatile __attribute__((section(".data"))) jiffies;
>> unsigned long volatile __attribute__((section(".data"))) jiffies=100;
>> unsigned long long  jiffies_64 __attribute__((__aligned__((1 << (6))))) =
>> ((unsigned long)(unsigned int) (-300*1000));
>> void do_timer(unsigned long ticks)
>> {
>>        jiffies_64 += ticks;
>> }
>> int main()
>> {
>> do_timer(1);
>> printf("%d\n", jiffies_64);
>> printf("%d\n", jiffies);
>> }
>>
>> $cat a.lds:
>> iffies_64 = jiffies;
>>
>> The problem is when link with "a.lds", the output of open64 is wrong.
>> The output of jiffies_64 and jiffies should be the same according to
>> the linker script.
>> opencc a.lds timer.c -O0 -keep
>> ./a.out
>> -299999
>> 100
>>
>> when compile with gcc
>> ./a.out
>> 101
>> 101
>>
>> The root reason is in open64, the preemitable symbol is addressed
>> through base and offset.
>> the output of timer.s:
>>  #   3  extern unsigned long volatile __attribute__((section(".data")))
>> jiffies;
>>  #   4  unsigned long volatile __attribute__((section(".data")))
>> jiffies=100;
>>  #   5  unsigned long long  jiffies_64 __attribute__((__aligned__((1 <<
>> (6)))))
>> = ((unsigned long)(unsigned int) (-300*1000));
>>  #   6  void do_timer(unsigned long ticks)
>>  #   7  {
>> .LBB1_do_timer:
>>        pushq %rbp                      #
>>        movq %rsp,%rbp                  #
>>        addq $-32,%rsp                  #
>>        movq %rdi,-16(%rbp)             # ticks
>>        .loc    1       8       0
>>  #   8          jiffies_64 += ticks;
>>        movq -16(%rbp),%rdi             # ticks
>>        movq .data(%rip),%rax           #
>>        addq %rdi,%rax                  #
>>        movq %rax,.data(%rip)           #
>>        leave                           #
>>        ret                             #
>> .LDWend_do_timer:
>>        .size do_timer, .LDWend_do_timer-do_timer
>>
>> symbol jiffies_64 is represent through .data(%rip), but not
>>  jiffies_64(%rip),
>> so when in the linker script reset the address of jiffies_64 does not
>> work.
>>
>> The patch attached at bug848_1.patch.  There is a regression caused by
>> bug848_1.patch, the case is:
>>
>> extern void abort (void);
>>
>> volatile int out = 1;
>> volatile int a = 2;
>> volatile int b = 4;
>> volatile int c = 8;
>> volatile int d = 16;
>> volatile int e = 32;
>> volatile int f = 64;
>>
>> int
>> main ()
>> {
>>  asm volatile ("xorl %%eax, %%eax      \n\t"
>>                "xorl %%esi, %%esi      \n\t"
>>                "addl %1, %0            \n\t"
>>                "addl %2, %0            \n\t"
>>                "addl %3, %0            \n\t"
>>                "addl %4, %0            \n\t"
>>                "addl %5, %0            \n\t"
>>                "addl %6, %0"
>>                : "+r" (out)
>>                : "r" (a), "r" (b), "r" (c), "g" (d), "g" (e), "g" (f)
>>                : "%eax", "%esi");
>>
>>  if (out != 127)
>>    abort ();
>>
>>  return 0;
>> }
>>
>> The cause is that for asm string,  there is following code in fun
>> "Modify_Asm_String":
>>    ST* st = TN_var(tn);
>>    Base_Symbol_And_Offset( st, &base_st, &base_ofst );
>>  Base_Symbol_And_Offset does not consider whether shoud use
>> base-offset or not. So I change the call to
>> "Base_Symbol_And_Offset_For_Addressing". see bug848_2.patch
>>
>> Thanks
>> zhuqing
>>
>>
>> ------------------------------------------------------------------------------
>> RSA(R) Conference 2012
>> Save $700 by Nov 18
>> Register now
>> http://p.sf.net/sfu/rsa-sfdev2dev1
>> _______________________________________________
>> Open64-devel mailing list
>> Open64-devel@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/open64-devel
>>
>
>
> ------------------------------------------------------------------------------
> RSA(R) Conference 2012
> Save $700 by Nov 18
> Register now
> http://p.sf.net/sfu/rsa-sfdev2dev1
> _______________________________________________
> Open64-devel mailing list
> Open64-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/open64-devel
>
>



-- 
Regards,
Lai Jian-Xin

------------------------------------------------------------------------------
RSA(R) Conference 2012
Save $700 by Nov 18
Register now
http://p.sf.net/sfu/rsa-sfdev2dev1
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to