| From foo@baz Mon Apr 9 17:09:24 CEST 2018 |
| From: Heiko Carstens <heiko.carstens@de.ibm.com> |
| Date: Thu, 4 May 2017 09:42:22 +0200 |
| Subject: s390: move _text symbol to address higher than zero |
| |
| From: Heiko Carstens <heiko.carstens@de.ibm.com> |
| |
| |
| [ Upstream commit d04a4c76f71dd5335f8e499b59617382d84e2b8d ] |
| |
| The perf tool assumes that kernel symbols are never present at address |
| zero. In fact it assumes if functions that map symbols to addresses |
| return zero, that the symbol was not found. |
| |
| Given that s390's _text symbol historically is located at address zero |
| this yields at least a couple of false errors and warnings in one of |
| perf's test cases about not present symbols ("perf test 1"). |
| |
| To fix this simply move the _text symbol to address 0x200, just behind |
| the initial psw and channel program located at the beginning of the |
| kernel image. This is now hard coded within the linker script. |
| |
| I tried a nicer solution which moves the initial psw and channel |
| program into an own section. However that would move the symbols |
| within the "real" head.text section to different addresses, since the |
| ".org" statements within head.S are relative to the head.text |
| section. If there is a new section in front, everything else will be |
| moved. Alternatively I could have adjusted all ".org" statements. But |
| this current solution seems to be the easiest one, since nobody really |
| cares where the _text symbol is actually located. |
| |
| Reported-by: Zvonko Kosic <zkosic@linux.vnet.ibm.com> |
| Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> |
| Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/s390/kernel/vmlinux.lds.S | 8 +++++++- |
| 1 file changed, 7 insertions(+), 1 deletion(-) |
| |
| --- a/arch/s390/kernel/vmlinux.lds.S |
| +++ b/arch/s390/kernel/vmlinux.lds.S |
| @@ -31,8 +31,14 @@ SECTIONS |
| { |
| . = 0x00000000; |
| .text : { |
| - _text = .; /* Text and read-only data */ |
| + /* Text and read-only data */ |
| HEAD_TEXT |
| + /* |
| + * E.g. perf doesn't like symbols starting at address zero, |
| + * therefore skip the initial PSW and channel program located |
| + * at address zero and let _text start at 0x200. |
| + */ |
| + _text = 0x200; |
| TEXT_TEXT |
| SCHED_TEXT |
| CPUIDLE_TEXT |