vmalloc_to_pfn returns 32 bit address on Linux 32 system. Why does it chop off higher bits of PAE physical address?
===

I'm using **vmalloc_to_pfn()** to get the physical address on a 32-bit PAE Linux system. It looks like vmalloc_to_pfn() returns "unsigned long" which means it is 32 bit on a 32 bit system, 64 bit on a 64-bit system.  On 64-bit Linux, unsigned long is 64 bit and I've no issues.

Problem:
Using this function to convert virtual to physical:

VA: **0xf8ab87fc** 
PA using vmalloc_to_pfn: **0x36f7f7fc**. But I'm actually expecting: **0x136f7f7fc**.

The physical address falls between 4 to 5 GB. But I can't get the exact physical address, I only get the chopped off 32-bit address. Is there another way to get **true physical address?**