Hi,
On 4 October 2013 19:01, Maxim Uvarov maxim.uvarov@linaro.org wrote:
On 10/04/2013 07:40 PM, Victor Kamensky wrote:
Hi Maxim,
readl and writel are stronger version of readl_realxed and writel_relaxed:
#define readl(c) ({ u32 __v = readl_relaxed(c); __iormb(); __v; }) #define writel(v,c) ({ __iowmb(); writel_relaxed(v,c); })
They just add __iormb and __iowmb, I think it is very dangerous thing to drop those memory barriers. I don't think your change is correct and/or it requires way better explanation.
I've run into the same crash while working on 3.12-rc3 BE issues. In fact I saw this failure on both BE and LE and on old versions of BE kernels when I tried to use 4.8 gcc version from 13.09 release. When I fall back to 4.7 (i.e 13.04) it works fine
I would think it is compiler issue or preexisting issue in the code uncovered by compiler change. Personally I think it is the first. Since I am chasing another problem I did not have time to look more deeply into the issue. IMHO it definitely require more digging. In mean time you can quickly check your current version and try another one if your looks as one described in this email.
Thanks, Victor
Ah, yes, it __raw_write has direct access and writel swaps bits.
If it's compiler issue then it has to be simple to compare objdump disasm output for that function.
I think I've hit this issue. We use latest Linaro GCC 4.8 in the CI loop to build Arndale BE kernel. Is there a bug reported to TCWG? If not, please create one: https://bugs.launchpad.net/gcc-linaro/+filebug
FYI, I'm using Linaro GCC 4.8-2013.09 (pre-built) and latest linaro-linaro (based on 3.12-rc5 with Victor's topic branch). Boot log attached.
Cheers, Fathi
I've debugged the issue under JTAG. I do believe it is compiler bug. Briefly: compiler miscalculated size of wonderful arrays in xhci_check_trb_in_td_math function as result this function corrupts registers saved on stack, upon restoring of those xhci_mem_init accesses not existent memory and crashes. At this point I think error is present in both 4.8 and 4.7 the only difference is registers allocation is a bit different so corruption does not manifest itself as severe problem in case of 4.7. Will double check 4.7 tomorrow, quite sure about 4.8.
I will file detailed bug report tomorrow PST, with test case and detailed explanation.
Thanks, Victor
On 18 October 2013 23:45, Fathi Boudra fathi.boudra@linaro.org wrote:
Hi,
On 4 October 2013 19:01, Maxim Uvarov maxim.uvarov@linaro.org wrote:
On 10/04/2013 07:40 PM, Victor Kamensky wrote:
Hi Maxim,
readl and writel are stronger version of readl_realxed and writel_relaxed:
#define readl(c) ({ u32 __v = readl_relaxed(c); __iormb(); __v; }) #define writel(v,c) ({ __iowmb(); writel_relaxed(v,c); })
They just add __iormb and __iowmb, I think it is very dangerous thing to drop those memory barriers. I don't think your change is correct and/or it requires way better explanation.
I've run into the same crash while working on 3.12-rc3 BE issues. In fact I saw this failure on both BE and LE and on old versions of BE kernels when I tried to use 4.8 gcc version from 13.09 release. When I fall back to 4.7 (i.e 13.04) it works fine
I would think it is compiler issue or preexisting issue in the code uncovered by compiler change. Personally I think it is the first. Since I am chasing another problem I did not have time to look more deeply into the issue. IMHO it definitely require more digging. In mean time you can quickly check your current version and try another one if your looks as one described in this email.
Thanks, Victor
Ah, yes, it __raw_write has direct access and writel swaps bits.
If it's compiler issue then it has to be simple to compare objdump disasm output for that function.
I think I've hit this issue. We use latest Linaro GCC 4.8 in the CI loop to build Arndale BE kernel. Is there a bug reported to TCWG? If not, please create one: https://bugs.launchpad.net/gcc-linaro/+filebug
FYI, I'm using Linaro GCC 4.8-2013.09 (pre-built) and latest linaro-linaro (based on 3.12-rc5 with Victor's topic branch). Boot log attached.
Cheers, Fathi
issue reported as
https://bugs.launchpad.net/gcc-linaro/+bug/1243022
Thanks, Victor
On 21 October 2013 00:54, Victor Kamensky victor.kamensky@linaro.org wrote:
I've debugged the issue under JTAG. I do believe it is compiler bug. Briefly: compiler miscalculated size of wonderful arrays in xhci_check_trb_in_td_math function as result this function corrupts registers saved on stack, upon restoring of those xhci_mem_init accesses not existent memory and crashes. At this point I think error is present in both 4.8 and 4.7 the only difference is registers allocation is a bit different so corruption does not manifest itself as severe problem in case of 4.7. Will double check 4.7 tomorrow, quite sure about 4.8.
I will file detailed bug report tomorrow PST, with test case and detailed explanation.
Thanks, Victor
On 18 October 2013 23:45, Fathi Boudra fathi.boudra@linaro.org wrote:
Hi,
On 4 October 2013 19:01, Maxim Uvarov maxim.uvarov@linaro.org wrote:
On 10/04/2013 07:40 PM, Victor Kamensky wrote:
Hi Maxim,
readl and writel are stronger version of readl_realxed and writel_relaxed:
#define readl(c) ({ u32 __v = readl_relaxed(c); __iormb(); __v; }) #define writel(v,c) ({ __iowmb(); writel_relaxed(v,c); })
They just add __iormb and __iowmb, I think it is very dangerous thing to drop those memory barriers. I don't think your change is correct and/or it requires way better explanation.
I've run into the same crash while working on 3.12-rc3 BE issues. In fact I saw this failure on both BE and LE and on old versions of BE kernels when I tried to use 4.8 gcc version from 13.09 release. When I fall back to 4.7 (i.e 13.04) it works fine
I would think it is compiler issue or preexisting issue in the code uncovered by compiler change. Personally I think it is the first. Since I am chasing another problem I did not have time to look more deeply into the issue. IMHO it definitely require more digging. In mean time you can quickly check your current version and try another one if your looks as one described in this email.
Thanks, Victor
Ah, yes, it __raw_write has direct access and writel swaps bits.
If it's compiler issue then it has to be simple to compare objdump disasm output for that function.
I think I've hit this issue. We use latest Linaro GCC 4.8 in the CI loop to build Arndale BE kernel. Is there a bug reported to TCWG? If not, please create one: https://bugs.launchpad.net/gcc-linaro/+filebug
FYI, I'm using Linaro GCC 4.8-2013.09 (pre-built) and latest linaro-linaro (based on 3.12-rc5 with Victor's topic branch). Boot log attached.
Cheers, Fathi
linaro-toolchain@lists.linaro.org