Messages in this thread | | | Date | Fri, 14 Dec 2018 10:59:17 +0800 | From | Chao Fan <> | Subject | Re: [PATCH v13 1/6] x86/boot: Introduce kstrtoull() to boot directory instead of simple_strtoull() |
| |
>> +static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) >> +{ >> + union { >> + u64 v64; >> + u32 v32[2]; >> + } d = { dividend }; >> + u32 upper; >> + >> + upper = d.v32[1]; >> + d.v32[1] = 0; >> + if (upper >= divisor) { >> + d.v32[1] = upper / divisor; >> + upper %= divisor; >> + } >> + asm ("divl %2" : "=a" (d.v32[0]), "=d" (*remainder) : >> + "rm" (divisor), "0" (d.v32[0]), "1" (upper)); >> + return d.v64; >> +} > >Why aren't you using the simple one from include/linux/math64.h ?
Cant't use div_u64() in math64.h directly, because that will cause ld error.
Even in 64-bit environment, arch/x86/boot/*.o will be built as 32-bit binary. In 64-bit binary, the dividend is handled as 64-bit value, that's OK, but in 32-bit binary, that's wrong. So it's necessary to separate the dividend to upper and lower in 32-bit binary. That's why copy the needed div_u64() here.
So, when copying kstrtoull(), we should copy div_u64(). When trying to include lib/kstrtox.c, even if other error in make period are solved, we will also meet this error. We should also copy div_u64 also. And then cover the math64.h in boot/string.c, and hanlde the other error and warining who comes together.
So just like Baoquan said, it's a good choice to use simple_strtoull() for now.
Thanks, Chao Fan
> >Rest looks ok. > >-- >Regards/Gruss, > Boris. > >Good mailing practices for 400: avoid top-posting and trim the reply. > >
| |