The __START_KERNEL_map needs to cover the 2GB that the kernel needs for
modules and the cpu area 0. The remaining 28GB can be out of range.
My proporsal is -32GB + 2MB. It keeps the arrangement.
32bit sign extension for what? Absolute data references? The addressing
that I have seen was IP relative. Thus I thought that the kernel could be
moved lower.
The linker references are to per cpu data already in the 0-MAX_CPU_AREA
range after this patchset. The problem is the relocation of the
references when the linker calculates the address of a per cpu variable.
F.e. The pda is placed at absolute address 0
In order to access the pda we have to do either
1. A CPU_PTR(offsetof pda,<cpu>) which is
offsetof pda (so 0) + cpu_area + cpu << area_shift
The compiler currently folds
offsetof pda + cpu_area
and then addds the shift later.
or
2. We use a CPU_xx op with a segment register.
Then we have no need to add cpu area because it is included in the gs
offset.
So only case 1 is affected which is not used if cpu ops can be used.
There are still critical path uses of that operation so I would really
like to avoid the explicit calculation.
If we would go the proposed route then the folding of the address would
have to be replaced by the linker by an explicit calculation.
-