static bool reipl_ccw_clear;
 static bool reipl_eckd_clear;
 
-static inline int __diag308(unsigned long subcode, void *addr)
+static inline int __diag308(unsigned long subcode, unsigned long addr)
 {
        union register_pair r1;
 
-       r1.even = (unsigned long) addr;
+       r1.even = addr;
        r1.odd  = 0;
        asm volatile(
                "       diag    %[r1],%[subcode],0x308\n"
 int diag308(unsigned long subcode, void *addr)
 {
        diag_stat_inc(DIAG_STAT_X308);
-       return __diag308(subcode, addr);
+       return __diag308(subcode, addr ? virt_to_phys(addr) : 0);
 }
 EXPORT_SYMBOL_GPL(diag308);