Skip to content

Commit 5dee19b

Browse files
tlendackybp3tk0v
authored andcommitted
x86/sev: Fix calculation of end address based on number of pages
When calculating an end address based on an unsigned int number of pages, any value greater than or equal to 0x100000 that is shift PAGE_SHIFT bits results in a 0 value, resulting in an invalid end address. Change the number of pages variable in various routines from an unsigned int to an unsigned long to calculate the end address correctly. Fixes: 5e5ccff ("x86/sev: Add helper for validating pages in early enc attribute changes") Fixes: dc3f3d2 ("x86/mm: Validate memory when changing the C-bit") Signed-off-by: Tom Lendacky <[email protected]> Signed-off-by: Borislav Petkov (AMD) <[email protected]> Link: https://lore.kernel.org/r/6a6e4eea0e1414402bac747744984fa4e9c01bb6.1686063086.git.thomas.lendacky@amd.com
1 parent 75d090f commit 5dee19b

File tree

2 files changed

+15
-15
lines changed

2 files changed

+15
-15
lines changed

arch/x86/include/asm/sev.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -192,12 +192,12 @@ struct snp_guest_request_ioctl;
192192

193193
void setup_ghcb(void);
194194
void __init early_snp_set_memory_private(unsigned long vaddr, unsigned long paddr,
195-
unsigned int npages);
195+
unsigned long npages);
196196
void __init early_snp_set_memory_shared(unsigned long vaddr, unsigned long paddr,
197-
unsigned int npages);
197+
unsigned long npages);
198198
void __init snp_prep_memory(unsigned long paddr, unsigned int sz, enum psc_op op);
199-
void snp_set_memory_shared(unsigned long vaddr, unsigned int npages);
200-
void snp_set_memory_private(unsigned long vaddr, unsigned int npages);
199+
void snp_set_memory_shared(unsigned long vaddr, unsigned long npages);
200+
void snp_set_memory_private(unsigned long vaddr, unsigned long npages);
201201
void snp_set_wakeup_secondary_cpu(void);
202202
bool snp_init(struct boot_params *bp);
203203
void __init __noreturn snp_abort(void);
@@ -212,12 +212,12 @@ static inline int pvalidate(unsigned long vaddr, bool rmp_psize, bool validate)
212212
static inline int rmpadjust(unsigned long vaddr, bool rmp_psize, unsigned long attrs) { return 0; }
213213
static inline void setup_ghcb(void) { }
214214
static inline void __init
215-
early_snp_set_memory_private(unsigned long vaddr, unsigned long paddr, unsigned int npages) { }
215+
early_snp_set_memory_private(unsigned long vaddr, unsigned long paddr, unsigned long npages) { }
216216
static inline void __init
217-
early_snp_set_memory_shared(unsigned long vaddr, unsigned long paddr, unsigned int npages) { }
217+
early_snp_set_memory_shared(unsigned long vaddr, unsigned long paddr, unsigned long npages) { }
218218
static inline void __init snp_prep_memory(unsigned long paddr, unsigned int sz, enum psc_op op) { }
219-
static inline void snp_set_memory_shared(unsigned long vaddr, unsigned int npages) { }
220-
static inline void snp_set_memory_private(unsigned long vaddr, unsigned int npages) { }
219+
static inline void snp_set_memory_shared(unsigned long vaddr, unsigned long npages) { }
220+
static inline void snp_set_memory_private(unsigned long vaddr, unsigned long npages) { }
221221
static inline void snp_set_wakeup_secondary_cpu(void) { }
222222
static inline bool snp_init(struct boot_params *bp) { return false; }
223223
static inline void snp_abort(void) { }

arch/x86/kernel/sev.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,7 @@ static u64 __init get_jump_table_addr(void)
645645
return ret;
646646
}
647647

648-
static void pvalidate_pages(unsigned long vaddr, unsigned int npages, bool validate)
648+
static void pvalidate_pages(unsigned long vaddr, unsigned long npages, bool validate)
649649
{
650650
unsigned long vaddr_end;
651651
int rc;
@@ -662,7 +662,7 @@ static void pvalidate_pages(unsigned long vaddr, unsigned int npages, bool valid
662662
}
663663
}
664664

665-
static void __init early_set_pages_state(unsigned long paddr, unsigned int npages, enum psc_op op)
665+
static void __init early_set_pages_state(unsigned long paddr, unsigned long npages, enum psc_op op)
666666
{
667667
unsigned long paddr_end;
668668
u64 val;
@@ -701,7 +701,7 @@ static void __init early_set_pages_state(unsigned long paddr, unsigned int npage
701701
}
702702

703703
void __init early_snp_set_memory_private(unsigned long vaddr, unsigned long paddr,
704-
unsigned int npages)
704+
unsigned long npages)
705705
{
706706
/*
707707
* This can be invoked in early boot while running identity mapped, so
@@ -723,7 +723,7 @@ void __init early_snp_set_memory_private(unsigned long vaddr, unsigned long padd
723723
}
724724

725725
void __init early_snp_set_memory_shared(unsigned long vaddr, unsigned long paddr,
726-
unsigned int npages)
726+
unsigned long npages)
727727
{
728728
/*
729729
* This can be invoked in early boot while running identity mapped, so
@@ -879,7 +879,7 @@ static void __set_pages_state(struct snp_psc_desc *data, unsigned long vaddr,
879879
sev_es_terminate(SEV_TERM_SET_LINUX, GHCB_TERM_PSC);
880880
}
881881

882-
static void set_pages_state(unsigned long vaddr, unsigned int npages, int op)
882+
static void set_pages_state(unsigned long vaddr, unsigned long npages, int op)
883883
{
884884
unsigned long vaddr_end, next_vaddr;
885885
struct snp_psc_desc *desc;
@@ -904,7 +904,7 @@ static void set_pages_state(unsigned long vaddr, unsigned int npages, int op)
904904
kfree(desc);
905905
}
906906

907-
void snp_set_memory_shared(unsigned long vaddr, unsigned int npages)
907+
void snp_set_memory_shared(unsigned long vaddr, unsigned long npages)
908908
{
909909
if (!cc_platform_has(CC_ATTR_GUEST_SEV_SNP))
910910
return;
@@ -914,7 +914,7 @@ void snp_set_memory_shared(unsigned long vaddr, unsigned int npages)
914914
set_pages_state(vaddr, npages, SNP_PAGE_STATE_SHARED);
915915
}
916916

917-
void snp_set_memory_private(unsigned long vaddr, unsigned int npages)
917+
void snp_set_memory_private(unsigned long vaddr, unsigned long npages)
918918
{
919919
if (!cc_platform_has(CC_ATTR_GUEST_SEV_SNP))
920920
return;

0 commit comments

Comments
 (0)