s = offs & ~PAGE_MASK;
l = min(PAGE_SIZE - s, len);
- rc = gvirt_to_maddr(load_addr + offs, &ma);
+ rc = gvirt_to_maddr(load_addr + offs, &ma, GV2M_WRITE);
if ( rc )
{
panic("Unable to translate guest address");
void *p;
unsigned size = min(len, (unsigned)PAGE_SIZE - offset);
- if ( gvirt_to_maddr((vaddr_t) to, &g) )
+ if ( gvirt_to_maddr((vaddr_t) to, &g, GV2M_WRITE) )
return len;
p = map_domain_page(g>>PAGE_SHIFT);
void *p;
unsigned size = min(len, (unsigned)PAGE_SIZE - offset);
- if ( gvirt_to_maddr((vaddr_t) to, &g) )
+ if ( gvirt_to_maddr((vaddr_t) to, &g, GV2M_WRITE) )
return len;
p = map_domain_page(g>>PAGE_SHIFT);
void *p;
unsigned size = min(len, (unsigned)(PAGE_SIZE - offset));
- if ( gvirt_to_maddr((vaddr_t) from & PAGE_MASK, &g) )
+ if ( gvirt_to_maddr((vaddr_t) from & PAGE_MASK, &g, GV2M_READ) )
return len;
p = map_domain_page(g>>PAGE_SHIFT);
s = offs & ~PAGE_MASK;
l = min(PAGE_SIZE - s, len);
- rc = gvirt_to_maddr(load_addr + offs, &ma);
+ rc = gvirt_to_maddr(load_addr + offs, &ma, GV2M_WRITE);
if ( rc )
{
panic("Unable to map translate guest address");
printk("Guest stack trace from sp=%"PRIvaddr":\n ", sp);
- if ( gvirt_to_maddr(sp, &stack_phys) )
+ if ( gvirt_to_maddr(sp, &stack_phys, GV2M_READ) )
{
printk("Failed to convert stack to physical address\n");
return;
}
/* Ask the MMU to translate a Guest VA for us */
-static inline uint64_t gva_to_ma_par(vaddr_t va)
+static inline uint64_t gva_to_ma_par(vaddr_t va, unsigned int flags)
{
uint64_t par, tmp;
tmp = READ_CP64(PAR);
- WRITE_CP32(va, ATS12NSOPR);
+ if ( (flags & GV2M_WRITE) == GV2M_WRITE )
+ WRITE_CP32(va, ATS12NSOPW);
+ else
+ WRITE_CP32(va, ATS12NSOPR);
isb(); /* Ensure result is available. */
par = READ_CP64(PAR);
WRITE_CP64(tmp, PAR);
}
/* Ask the MMU to translate a Guest VA for us */
-static inline uint64_t gva_to_ma_par(vaddr_t va)
+static inline uint64_t gva_to_ma_par(vaddr_t va, unsigned int flags)
{
uint64_t par, tmp = READ_SYSREG64(PAR_EL1);
- asm volatile ("at s12e1r, %0;" : : "r" (va));
+ if ( (flags & GV2M_WRITE) == GV2M_WRITE )
+ asm volatile ("at s12e1r, %0;" : : "r" (va));
+ else
+ asm volatile ("at s12e1w, %0;" : : "r" (va));
isb();
par = READ_SYSREG64(PAR_EL1);
WRITE_SYSREG64(tmp, PAR_EL1);
}
#endif
-static inline int gvirt_to_maddr(vaddr_t va, paddr_t *pa)
+static inline int gvirt_to_maddr(vaddr_t va, paddr_t *pa, unsigned int flags)
{
- uint64_t par = gva_to_ma_par(va);
+ uint64_t par = gva_to_ma_par(va, flags);
if ( par & PAR_F )
return -EFAULT;
*pa = (par & PADDR_MASK & PAGE_MASK) | ((unsigned long) va & ~PAGE_MASK);
#define MATTR_DEV 0x1
#define MATTR_MEM 0xf
+/* Flags for gvirt_to_maddr */
+#define GV2M_READ (0u<<0)
+#define GV2M_WRITE (1u<<0)
+
#ifndef __ASSEMBLY__
#include <xen/types.h>