lkml.org 
[lkml]   [2018]   [May]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/2] add a function(ioremap_encrypted) for kdump when AMD sme enabled.
    Date
    It is convenient to remap the old memory encrypted to the second kernel
    by calling ioremap_encrypted().

    Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
    ---
    arch/x86/include/asm/io.h | 2 ++
    arch/x86/mm/ioremap.c | 25 +++++++++++++++++--------
    2 files changed, 19 insertions(+), 8 deletions(-)

    diff --git a/arch/x86/include/asm/io.h b/arch/x86/include/asm/io.h
    index f6e5b93..06d2a9f 100644
    --- a/arch/x86/include/asm/io.h
    +++ b/arch/x86/include/asm/io.h
    @@ -192,6 +192,8 @@ extern void __iomem *ioremap_cache(resource_size_t offset, unsigned long size);
    #define ioremap_cache ioremap_cache
    extern void __iomem *ioremap_prot(resource_size_t offset, unsigned long size, unsigned long prot_val);
    #define ioremap_prot ioremap_prot
    +extern void __iomem *ioremap_encrypted(resource_size_t phys_addr, unsigned long size);
    +#define ioremap_encrypted ioremap_encrypted

    /**
    * ioremap - map bus memory into CPU space
    diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
    index c63a545..7a52d1e 100644
    --- a/arch/x86/mm/ioremap.c
    +++ b/arch/x86/mm/ioremap.c
    @@ -131,7 +131,8 @@ static void __ioremap_check_mem(resource_size_t addr, unsigned long size,
    * caller shouldn't need to know that small detail.
    */
    static void __iomem *__ioremap_caller(resource_size_t phys_addr,
    - unsigned long size, enum page_cache_mode pcm, void *caller)
    + unsigned long size, enum page_cache_mode pcm,
    + void *caller, bool encrypted)
    {
    unsigned long offset, vaddr;
    resource_size_t last_addr;
    @@ -199,7 +200,8 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr,
    * resulting mapping.
    */
    prot = PAGE_KERNEL_IO;
    - if (sev_active() && mem_flags.desc_other)
    + if ((sev_active() && mem_flags.desc_other) ||
    + (encrypted && sme_active()))
    prot = pgprot_encrypted(prot);

    switch (pcm) {
    @@ -291,7 +293,7 @@ void __iomem *ioremap_nocache(resource_size_t phys_addr, unsigned long size)
    enum page_cache_mode pcm = _PAGE_CACHE_MODE_UC_MINUS;

    return __ioremap_caller(phys_addr, size, pcm,
    - __builtin_return_address(0));
    + __builtin_return_address(0), false);
    }
    EXPORT_SYMBOL(ioremap_nocache);

    @@ -324,7 +326,7 @@ void __iomem *ioremap_uc(resource_size_t phys_addr, unsigned long size)
    enum page_cache_mode pcm = _PAGE_CACHE_MODE_UC;

    return __ioremap_caller(phys_addr, size, pcm,
    - __builtin_return_address(0));
    + __builtin_return_address(0), false);
    }
    EXPORT_SYMBOL_GPL(ioremap_uc);

    @@ -341,7 +343,7 @@ EXPORT_SYMBOL_GPL(ioremap_uc);
    void __iomem *ioremap_wc(resource_size_t phys_addr, unsigned long size)
    {
    return __ioremap_caller(phys_addr, size, _PAGE_CACHE_MODE_WC,
    - __builtin_return_address(0));
    + __builtin_return_address(0), false);
    }
    EXPORT_SYMBOL(ioremap_wc);

    @@ -358,14 +360,21 @@ EXPORT_SYMBOL(ioremap_wc);
    void __iomem *ioremap_wt(resource_size_t phys_addr, unsigned long size)
    {
    return __ioremap_caller(phys_addr, size, _PAGE_CACHE_MODE_WT,
    - __builtin_return_address(0));
    + __builtin_return_address(0), false);
    }
    EXPORT_SYMBOL(ioremap_wt);

    +void __iomem *ioremap_encrypted(resource_size_t phys_addr, unsigned long size)
    +{
    + return __ioremap_caller(phys_addr, size, _PAGE_CACHE_MODE_WB,
    + __builtin_return_address(0), true);
    +}
    +EXPORT_SYMBOL(ioremap_encrypted);
    +
    void __iomem *ioremap_cache(resource_size_t phys_addr, unsigned long size)
    {
    return __ioremap_caller(phys_addr, size, _PAGE_CACHE_MODE_WB,
    - __builtin_return_address(0));
    + __builtin_return_address(0), false);
    }
    EXPORT_SYMBOL(ioremap_cache);

    @@ -374,7 +383,7 @@ void __iomem *ioremap_prot(resource_size_t phys_addr, unsigned long size,
    {
    return __ioremap_caller(phys_addr, size,
    pgprot2cachemode(__pgprot(prot_val)),
    - __builtin_return_address(0));
    + __builtin_return_address(0), false);
    }
    EXPORT_SYMBOL(ioremap_prot);

    --
    2.9.5
    \
     
     \ /
      Last update: 2018-05-15 03:53    [W:3.480 / U:0.472 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site