Thiemo Seufer wrote: > Franck Bui-Huu wrote: >> Thiemo Seufer wrote: >>> Franck Bui-Huu wrote: >>>> - if (CPHYSADDR(initrd_end) > PFN_PHYS(max_low_pfn)) { >>>> + if (__pa(initrd_end) > PFN_PHYS(max_low_pfn)) { >>> ISTR this failed on O2, where kernel+initrd are loaded into KSEG0 but the >>> PAGE_OFFSET is for XKPHYS. >>> >> I guess that you were meaning somthing like: >> >> LOADADDR = 0xffffffff80004000 >> PAGE_OFFSET = 0xa800000000000000 >> >> is that correct ? > > Yes. > >> If so could you explain the choice of these values >> because I fail to understand it. > > It allows to load a 64-bit kernel in KSEG0, sorry to be ignorant of 64 bit kernels, but what's the point to load them in KSEG0. > and use short 2-instruction symbol references there. do you mean "it allows to use only 2 'lui' instructions to load a symbol address into a register" ? Futhermore I don't see how some part of the kernel convert virtual address into a physical one with such values. For example in setup.c, the function resource_init() does: code_resource.start = virt_to_phys(&_text); code_resource.end = virt_to_phys(&_etext) - 1; data_resource.start = virt_to_phys(&_etext); data_resource.end = virt_to_phys(&_edata) - 1; How does it work in this case ? Thanks Franck