On Tue, Jan 07, 2025 at 07:43:26PM +0800, Hans Zhang wrote: > > > On 2025/1/7 19:33, Niklas Cassel wrote: > > > Hi Niklas, > > > > > > resource_size_t bar_size; > > > remain = do_div((u64)bar_size, buf_size); > > > > > > It works for the arm platform. > > > > > > arch/arm/include/asm/div64.h > > > static inline uint32_t __div64_32(uint64_t *n, uint32_t base) > > > { > > > register unsigned int __base asm("r4") = base; > > > register unsigned long long __n asm("r0") = *n; > > > register unsigned long long __res asm("r2"); > > > unsigned int __rem; > > > asm( __asmeq("%0", "r0") > > > __asmeq("%1", "r2") > > > __asmeq("%2", "r4") > > > "bl __do_div64" > > > : "+r" (__n), "=r" (__res) > > > : "r" (__base) > > > : "ip", "lr", "cc"); > > > __rem = __n >> 32; > > > *n = __res; > > > return __rem; > > > } > > > #define __div64_32 __div64_32 > > > > > > #define do_div(n, base) __div64_32(&(n), base) > > > > > > > > > For X86 platforms, do_div is a macro definition, and the first parameter > > > does not define its type. If the macro definition is replaced directly, an > > > error will be reported in the ubuntu20.04 release. > > > > What is the error? > > > > We don't need to use do_div(). > > The current code that does normal / and % works fine on both > > 32-bit and 64-bit if you just do: > > > > static bool pci_endpoint_test_bar(struct pci_endpoint_test *test, > > enum pci_barno barno) > > { > > - int j, bar_size, buf_size, iters, remain; > > + int j, buf_size, iters, remain; > > void *write_buf __free(kfree) = NULL; > > void *read_buf __free(kfree) = NULL; > > struct pci_dev *pdev = test->pdev; > > + u64 bar_size; > > > > No? > > > Hi Niklas, > > Please look at the robot compilation error. > > https://patchwork.kernel.org/project/linux-pci/patch/20241231065500.168799-1-18255117159@xxxxxxx/ > > drivers/misc/pci_endpoint_test.c:315: undefined reference to `__udivmoddi4' That error was for your patch that changed bar_size to resource_size_t, which is typedefed to phys_addr_t, which can be either 32-bits or 64-bits on 32-bit systems (depending on CONFIG_X86_PAE). I was suggesting to just change it to u64, so it will unconditionally be 64-bits. Kind regards, Niklas