[okl4-developer] OKL4 2.1: Original version of 'arch/arm/pistachio/cpu/arm926ejs/include/cache.h' is not compilable
Frank Kaiser
frank.kaiser at opensynergy.com
Thu Jul 10 00:31:14 EST 2008
Hello
When I started my platform development, I drew the okl4_2.1.tar.gz
tarball from http://wiki.ok-labs.com/FrontPage?action=AttachFile.
Unzipping it, for some reason, I did not get out the core specific
include files 'cache.h', 'cpu.h' and 'syscon.h' located at
'arch/arm/pistachio/cpu/arm926ejs/include/'. Since there is no example
platform in the tarball using the ARM926EJ-S core, I thought they were
left out intentionally, and I created my own ones by combining the
XSCALE and ARM920T variants with ARM926EJ-S variants from OKL4 1.4.9. It
just did not occur to me that the unzip went wrong.
Meanwhile a colleague also used the mentioned tarball and put it in our
SVN repository. Recently I began to integrate my new platform code into
the SVN repository and discovered the missing header file. Comparing
them with my own creation showed that I have some insignificant
differences with 'cpu.h' and 'syscon.h', but a significant difference in
the referenced header files with 'cache.h'.
Here the include statements of the original:
#include <debug.h>
#include <cpu/syscon.h>
#include <cache.h>
#include <plat/platform.h> /* Get cache size */
Here the include statements of my private version:
#include <kernel/debug.h>
#include <kernel/arch/asm.h>
#include <kernel/cpu/syscon.h>
Another difference is that the original version contains the definition
'static const word_t CACHE_LINE_MASK = (CACHE_LINE_SIZE -
1)'
which does not exist in my private version, and I do not see that
CACHE_LINE_MASK is anywhere referenced.
My private version compiles w/o a flaw, but the original one files for
the first compiled source file (asid.cc) with the following multiple
error:
sam/pistachio/include/kernel/cpu/cache.h: In static member function
`static void arm_cache::cache_flush_i()':
sam/pistachio/include/kernel/cpu/cache.h:150: error: expected `)' before
"_"
sam/pistachio/include/kernel/cpu/cache.h:148: warning: unused variable
'zero'
The relevant code lines are:
__asm__ __volatile__ (
" mcr p15, 0, "_(zero)", c7, c5, 0 ;" /* Flush
I cache */
#if defined(__GNUC__)
:: [zero] "r" (zero)
#endif
The problem is that '_()' is a preprocessor macro defined in
'kernel/arch/asm.h' which the original file misses.
I made the addition to the original file by following its include path
scheme:
#include <debug.h>
#include <arch/asm.h>
#include <cpu/syscon.h>
#include <cache.h>
#include <plat/platform.h> /* Get cache size */
Surprisingly this correction does not work. I get most of the files of
the PISTACHIO kernel compiled until it comes to the platform specific
ones. With 'platform/at91/pistachio/src/interrupt.cc' the error
reappears, and additionally the compiler claims that it does not find
the header files 'debug.h', 'arch/asm.h', 'cpu/syscon.h', 'cache.h' and
'plat/platform.h', the 5 ones included by
'.../arm926ejs/include/cache.h'. Something must we wrong the the include
paths seen by the compiler, and a view in the log shows the difference.
When compiling, for instance 'asid.cc', the include paths are ('sam' is
the build directory):
-Isam/pistachio/include
-Isam/pistachio/object/pistachio/include
-Ipistachio/include
-Iarch/arm/pistachio/v5/include
However, for 'interrupt.cc' the include paths are:
-Isam/pistachio/include
-Isam/pistachio/object/pistachio/src
-Ipistachio/src
Both files share only the first include paths of both list. Checking
this location shows that 'asm.h' is found at
'sam/pistachio/include/kernel/arch'. That explains why my private
version of 'cache.h' finds it. But when compiling 'asid.cc' the original
version finds it too, and that is thru the second include path
'sam/pistachio/object/pistachio/include' under which copy of the arch
directory exists. It looks as if there is a mix-up of include paths
versus header file copies in the build directory. The question is:
* Why are there different include paths for the pistachio kernel
source files and for the platform-dependent source files?
* Why are there two copies of the architectural-, cpu-, kdb- and
platform-specific header files, one set in
'<build_dir>/pistachio/include/kernel' and one set in
'<build_dir>/pistachio/object/pistachio/include'?
Although the copies are created by SCONS, it is confusing regarding the
correct set-up of #include directives in the source file. If I had to
write my platform source files totally from scratch, I'd have had a hard
time with this. Actually I made a test compilation with an existing
platform to figure out how the build directory looks like after a
successful build.
Regards
Frank
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.okl4.org/pipermail/developer/attachments/20080709/8488079b/attachment.htm
More information about the Developer
mailing list