(unsigned long *)&ghcb->save.valid_bitmap);     \
        }                                                                       \
                                                                                \
+       static inline u64 ghcb_get_##field(struct ghcb *ghcb)                   \
+       {                                                                       \
+               return ghcb->save.field;                                        \
+       }                                                                       \
+                                                                               \
+       static inline u64 ghcb_get_##field##_if_valid(struct ghcb *ghcb)        \
+       {                                                                       \
+               return ghcb_##field##_is_valid(ghcb) ? ghcb->save.field : 0;    \
+       }                                                                       \
+                                                                               \
        static inline void ghcb_set_##field(struct ghcb *ghcb, u64 value)       \
        {                                                                       \
                __set_bit(GHCB_BITMAP_IDX(field),                               \
 
              ghcb_rbp_is_valid(ghcb)))
                return false;
 
-       regs->bx = ghcb->save.rbx;
-       regs->cx = ghcb->save.rcx;
-       regs->dx = ghcb->save.rdx;
-       regs->si = ghcb->save.rsi;
-       regs->di = ghcb->save.rdi;
-       regs->bp = ghcb->save.rbp;
+       regs->bx = ghcb_get_rbx(ghcb);
+       regs->cx = ghcb_get_rcx(ghcb);
+       regs->dx = ghcb_get_rdx(ghcb);
+       regs->si = ghcb_get_rsi(ghcb);
+       regs->di = ghcb_get_rdi(ghcb);
+       regs->bp = ghcb_get_rbp(ghcb);
 
        return true;
 }