@ -30,6 +30,7 @@
# include "qobject/qdict.h"
# include "qapi/error.h"
# include "qapi/qapi-commands-misc.h"
# include "system/memory.h"
/* Perform linear address sign extension */
static hwaddr addr_canonical ( CPUArchState * env , hwaddr addr )
@ -70,21 +71,21 @@ static void print_pte(Monitor *mon, CPUArchState *env, hwaddr addr,
static void tlb_info_32 ( Monitor * mon , CPUArchState * env , AddressSpace * as )
{
const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED ;
unsigned int l1 , l2 ;
uint32_t pgd , pde , pte ;
pgd = env - > cr [ 3 ] & ~ 0xfff ;
for ( l1 = 0 ; l1 < 1024 ; l1 + + ) {
cpu_physical_memory_read ( pgd + l1 * 4 , & pde , 4 ) ;
pde = le32_to_cpu ( pde ) ;
pde = address_space_ldl_le ( as , pgd + l1 * 4 , attrs , NULL ) ;
if ( pde & PG_PRESENT_MASK ) {
if ( ( pde & PG_PSE_MASK ) & & ( env - > cr [ 4 ] & CR4_PSE_MASK ) ) {
/* 4M pages */
print_pte ( mon , env , ( l1 < < 22 ) , pde , ~ ( ( 1 < < 21 ) - 1 ) ) ;
} else {
for ( l2 = 0 ; l2 < 1024 ; l2 + + ) {
cpu_physical_memory_read ( ( pde & ~ 0xfff ) + l2 * 4 , & pte , 4 ) ;
pte = le32_to_cpu ( pte ) ;
pte = address_space_ldl_le ( as , ( pde & ~ 0xfff ) + l2 * 4 ,
attrs , NULL ) ;
if ( pte & PG_PRESENT_MASK ) {
print_pte ( mon , env , ( l1 < < 22 ) + ( l2 < < 12 ) ,
pte & ~ PG_PSE_MASK ,
@ -98,19 +99,18 @@ static void tlb_info_32(Monitor *mon, CPUArchState *env, AddressSpace *as)
static void tlb_info_pae32 ( Monitor * mon , CPUArchState * env , AddressSpace * as )
{
const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED ;
unsigned int l1 , l2 , l3 ;
uint64_t pdpe , pde , pte ;
uint64_t pdp_addr , pd_addr , pt_addr ;
pdp_addr = env - > cr [ 3 ] & ~ 0x1f ;
for ( l1 = 0 ; l1 < 4 ; l1 + + ) {
cpu_physical_memory_read ( pdp_addr + l1 * 8 , & pdpe , 8 ) ;
pdpe = le64_to_cpu ( pdpe ) ;
pdpe = address_space_ldq_le ( as , pdp_addr + l1 * 8 , attrs , NULL ) ;
if ( pdpe & PG_PRESENT_MASK ) {
pd_addr = pdpe & 0x3fffffffff000ULL ;
for ( l2 = 0 ; l2 < 512 ; l2 + + ) {
cpu_physical_memory_read ( pd_addr + l2 * 8 , & pde , 8 ) ;
pde = le64_to_cpu ( pde ) ;
pde = address_space_ldq_le ( as , pd_addr + l2 * 8 , attrs , NULL ) ;
if ( pde & PG_PRESENT_MASK ) {
if ( pde & PG_PSE_MASK ) {
/* 2M pages with PAE, CR4.PSE is ignored */
@ -119,8 +119,8 @@ static void tlb_info_pae32(Monitor *mon, CPUArchState *env, AddressSpace *as)
} else {
pt_addr = pde & 0x3fffffffff000ULL ;
for ( l3 = 0 ; l3 < 512 ; l3 + + ) {
cpu_physical_memory_read ( pt_addr + l3 * 8 , & pte , 8 ) ;
pte = le64_to_cpu ( pte ) ;
pte = address_space_ldq_le ( as , pt_addr + l3 * 8 ,
attrs , NULL ) ;
if ( pte & PG_PRESENT_MASK ) {
print_pte ( mon , env , ( l1 < < 30 ) + ( l2 < < 21 )
+ ( l3 < < 12 ) ,
@ -139,21 +139,20 @@ static void tlb_info_pae32(Monitor *mon, CPUArchState *env, AddressSpace *as)
static void tlb_info_la48 ( Monitor * mon , CPUArchState * env , AddressSpace * as ,
uint64_t l0 , uint64_t pml4_addr )
{
const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED ;
uint64_t l1 , l2 , l3 , l4 ;
uint64_t pml4e , pdpe , pde , pte ;
uint64_t pdp_addr , pd_addr , pt_addr ;
for ( l1 = 0 ; l1 < 512 ; l1 + + ) {
cpu_physical_memory_read ( pml4_addr + l1 * 8 , & pml4e , 8 ) ;
pml4e = le64_to_cpu ( pml4e ) ;
pml4e = address_space_ldq_le ( as , pml4_addr + l1 * 8 , attrs , NULL ) ;
if ( ! ( pml4e & PG_PRESENT_MASK ) ) {
continue ;
}
pdp_addr = pml4e & 0x3fffffffff000ULL ;
for ( l2 = 0 ; l2 < 512 ; l2 + + ) {
cpu_physical_memory_read ( pdp_addr + l2 * 8 , & pdpe , 8 ) ;
pdpe = le64_to_cpu ( pdpe ) ;
pdpe = address_space_ldq_le ( as , pdp_addr + l2 * 8 , attrs , NULL ) ;
if ( ! ( pdpe & PG_PRESENT_MASK ) ) {
continue ;
}
@ -167,8 +166,7 @@ static void tlb_info_la48(Monitor *mon, CPUArchState *env, AddressSpace *as,
pd_addr = pdpe & 0x3fffffffff000ULL ;
for ( l3 = 0 ; l3 < 512 ; l3 + + ) {
cpu_physical_memory_read ( pd_addr + l3 * 8 , & pde , 8 ) ;
pde = le64_to_cpu ( pde ) ;
pde = address_space_ldq_le ( as , pd_addr + l3 * 8 , attrs , NULL ) ;
if ( ! ( pde & PG_PRESENT_MASK ) ) {
continue ;
}
@ -182,10 +180,8 @@ static void tlb_info_la48(Monitor *mon, CPUArchState *env, AddressSpace *as,
pt_addr = pde & 0x3fffffffff000ULL ;
for ( l4 = 0 ; l4 < 512 ; l4 + + ) {
cpu_physical_memory_read ( pt_addr
+ l4 * 8 ,
& pte , 8 ) ;
pte = le64_to_cpu ( pte ) ;
pte = address_space_ldq_le ( as , pt_addr + l4 * 8 ,
attrs , NULL ) ;
if ( pte & PG_PRESENT_MASK ) {
print_pte ( mon , env , ( l0 < < 48 ) + ( l1 < < 39 ) +
( l2 < < 30 ) + ( l3 < < 21 ) + ( l4 < < 12 ) ,
@ -199,14 +195,14 @@ static void tlb_info_la48(Monitor *mon, CPUArchState *env, AddressSpace *as,
static void tlb_info_la57 ( Monitor * mon , CPUArchState * env , AddressSpace * as )
{
const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED ;
uint64_t l0 ;
uint64_t pml5e ;
uint64_t pml5_addr ;
pml5_addr = env - > cr [ 3 ] & 0x3fffffffff000ULL ;
for ( l0 = 0 ; l0 < 512 ; l0 + + ) {
cpu_physical_memory_read ( pml5_addr + l0 * 8 , & pml5e , 8 ) ;
pml5e = le64_to_cpu ( pml5e ) ;
pml5e = address_space_ldq_le ( as , pml5_addr + l0 * 8 , attrs , NULL ) ;
if ( pml5e & PG_PRESENT_MASK ) {
tlb_info_la48 ( mon , env , as , l0 , pml5e & 0x3fffffffff000ULL ) ;
}
@ -275,6 +271,7 @@ static void mem_print(Monitor *mon, CPUArchState *env,
static void mem_info_32 ( Monitor * mon , CPUArchState * env , AddressSpace * as )
{
const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED ;
unsigned int l1 , l2 ;
int prot , last_prot ;
uint32_t pgd , pde , pte ;
@ -284,8 +281,7 @@ static void mem_info_32(Monitor *mon, CPUArchState *env, AddressSpace *as)
last_prot = 0 ;
start = - 1 ;
for ( l1 = 0 ; l1 < 1024 ; l1 + + ) {
cpu_physical_memory_read ( pgd + l1 * 4 , & pde , 4 ) ;
pde = le32_to_cpu ( pde ) ;
pde = address_space_ldl_le ( as , pgd + l1 * 4 , attrs , NULL ) ;
end = l1 < < 22 ;
if ( pde & PG_PRESENT_MASK ) {
if ( ( pde & PG_PSE_MASK ) & & ( env - > cr [ 4 ] & CR4_PSE_MASK ) ) {
@ -293,8 +289,8 @@ static void mem_info_32(Monitor *mon, CPUArchState *env, AddressSpace *as)
mem_print ( mon , env , & start , & last_prot , end , prot ) ;
} else {
for ( l2 = 0 ; l2 < 1024 ; l2 + + ) {
cpu_physical_memory_read ( ( pde & ~ 0xfff ) + l2 * 4 , & pte , 4 ) ;
pte = le32_to_cpu ( pte ) ;
pte = address_space_ldl_le ( as , ( pde & ~ 0xfff ) + l2 * 4 ,
attrs , NULL ) ;
end = ( l1 < < 22 ) + ( l2 < < 12 ) ;
if ( pte & PG_PRESENT_MASK ) {
prot = pte & pde &
@ -316,6 +312,7 @@ static void mem_info_32(Monitor *mon, CPUArchState *env, AddressSpace *as)
static void mem_info_pae32 ( Monitor * mon , CPUArchState * env , AddressSpace * as )
{
const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED ;
unsigned int l1 , l2 , l3 ;
int prot , last_prot ;
uint64_t pdpe , pde , pte ;
@ -326,14 +323,12 @@ static void mem_info_pae32(Monitor *mon, CPUArchState *env, AddressSpace *as)
last_prot = 0 ;
start = - 1 ;
for ( l1 = 0 ; l1 < 4 ; l1 + + ) {
cpu_physical_memory_read ( pdp_addr + l1 * 8 , & pdpe , 8 ) ;
pdpe = le64_to_cpu ( pdpe ) ;
pdpe = address_space_ldq_le ( as , pdp_addr + l1 * 8 , attrs , NULL ) ;
end = l1 < < 30 ;
if ( pdpe & PG_PRESENT_MASK ) {
pd_addr = pdpe & 0x3fffffffff000ULL ;
for ( l2 = 0 ; l2 < 512 ; l2 + + ) {
cpu_physical_memory_read ( pd_addr + l2 * 8 , & pde , 8 ) ;
pde = le64_to_cpu ( pde ) ;
pde = address_space_ldq_le ( as , pd_addr + l2 * 8 , attrs , NULL ) ;
end = ( l1 < < 30 ) + ( l2 < < 21 ) ;
if ( pde & PG_PRESENT_MASK ) {
if ( pde & PG_PSE_MASK ) {
@ -343,8 +338,8 @@ static void mem_info_pae32(Monitor *mon, CPUArchState *env, AddressSpace *as)
} else {
pt_addr = pde & 0x3fffffffff000ULL ;
for ( l3 = 0 ; l3 < 512 ; l3 + + ) {
cpu_physical_memory_read ( pt_addr + l3 * 8 , & pte , 8 ) ;
pte = le64_to_cpu ( pte ) ;
pte = address_space_ldq_le ( as , pt_addr + l3 * 8 ,
attrs , NULL ) ;
end = ( l1 < < 30 ) + ( l2 < < 21 ) + ( l3 < < 12 ) ;
if ( pte & PG_PRESENT_MASK ) {
prot = pte & pde & ( PG_USER_MASK | PG_RW_MASK |
@ -373,6 +368,7 @@ static void mem_info_pae32(Monitor *mon, CPUArchState *env, AddressSpace *as)
# ifdef TARGET_X86_64
static void mem_info_la48 ( Monitor * mon , CPUArchState * env , AddressSpace * as )
{
const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED ;
int prot , last_prot ;
uint64_t l1 , l2 , l3 , l4 ;
uint64_t pml4e , pdpe , pde , pte ;
@ -382,14 +378,12 @@ static void mem_info_la48(Monitor *mon, CPUArchState *env, AddressSpace *as)
last_prot = 0 ;
start = - 1 ;
for ( l1 = 0 ; l1 < 512 ; l1 + + ) {
cpu_physical_memory_read ( pml4_addr + l1 * 8 , & pml4e , 8 ) ;
pml4e = le64_to_cpu ( pml4e ) ;
pml4e = address_space_ldq_le ( as , pml4_addr + l1 * 8 , attrs , NULL ) ;
end = l1 < < 39 ;
if ( pml4e & PG_PRESENT_MASK ) {
pdp_addr = pml4e & 0x3fffffffff000ULL ;
for ( l2 = 0 ; l2 < 512 ; l2 + + ) {
cpu_physical_memory_read ( pdp_addr + l2 * 8 , & pdpe , 8 ) ;
pdpe = le64_to_cpu ( pdpe ) ;
pdpe = address_space_ldq_le ( as , pdp_addr + l2 * 8 , attrs , NULL ) ;
end = ( l1 < < 39 ) + ( l2 < < 30 ) ;
if ( pdpe & PG_PRESENT_MASK ) {
if ( pdpe & PG_PSE_MASK ) {
@ -400,8 +394,8 @@ static void mem_info_la48(Monitor *mon, CPUArchState *env, AddressSpace *as)
} else {
pd_addr = pdpe & 0x3fffffffff000ULL ;
for ( l3 = 0 ; l3 < 512 ; l3 + + ) {
cpu_physical_memory_read ( pd_addr + l3 * 8 , & pde , 8 ) ;
pde = le64_to_cpu ( pde ) ;
pde = address_space_ldq_le ( as , pd_addr + l3 * 8 ,
attrs , NULL ) ;
end = ( l1 < < 39 ) + ( l2 < < 30 ) + ( l3 < < 21 ) ;
if ( pde & PG_PRESENT_MASK ) {
if ( pde & PG_PSE_MASK ) {
@ -413,10 +407,10 @@ static void mem_info_la48(Monitor *mon, CPUArchState *env, AddressSpace *as)
} else {
pt_addr = pde & 0x3fffffffff000ULL ;
for ( l4 = 0 ; l4 < 512 ; l4 + + ) {
cpu_physical_memory_read ( pt_addr
+ l4 * 8 ,
& pte , 8 ) ;
pte = le64_to_cpu ( pte ) ;
pte = address_space_ldq_le ( as ,
pt_addr
+ l4 * 8 ,
attrs , NULL ) ;
end = ( l1 < < 39 ) + ( l2 < < 30 ) +
( l3 < < 21 ) + ( l4 < < 12 ) ;
if ( pte & PG_PRESENT_MASK ) {
@ -453,6 +447,7 @@ static void mem_info_la48(Monitor *mon, CPUArchState *env, AddressSpace *as)
static void mem_info_la57 ( Monitor * mon , CPUArchState * env , AddressSpace * as )
{
const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED ;
int prot , last_prot ;
uint64_t l0 , l1 , l2 , l3 , l4 ;
uint64_t pml5e , pml4e , pdpe , pde , pte ;
@ -462,8 +457,7 @@ static void mem_info_la57(Monitor *mon, CPUArchState *env, AddressSpace *as)
last_prot = 0 ;
start = - 1 ;
for ( l0 = 0 ; l0 < 512 ; l0 + + ) {
cpu_physical_memory_read ( pml5_addr + l0 * 8 , & pml5e , 8 ) ;
pml5e = le64_to_cpu ( pml5e ) ;
pml5e = address_space_ldq_le ( as , pml5_addr + l0 * 8 , attrs , NULL ) ;
end = l0 < < 48 ;
if ( ! ( pml5e & PG_PRESENT_MASK ) ) {
prot = 0 ;
@ -473,8 +467,7 @@ static void mem_info_la57(Monitor *mon, CPUArchState *env, AddressSpace *as)
pml4_addr = pml5e & 0x3fffffffff000ULL ;
for ( l1 = 0 ; l1 < 512 ; l1 + + ) {
cpu_physical_memory_read ( pml4_addr + l1 * 8 , & pml4e , 8 ) ;
pml4e = le64_to_cpu ( pml4e ) ;
pml4e = address_space_ldq_le ( as , pml4_addr + l1 * 8 , attrs , NULL ) ;
end = ( l0 < < 48 ) + ( l1 < < 39 ) ;
if ( ! ( pml4e & PG_PRESENT_MASK ) ) {
prot = 0 ;
@ -484,8 +477,7 @@ static void mem_info_la57(Monitor *mon, CPUArchState *env, AddressSpace *as)
pdp_addr = pml4e & 0x3fffffffff000ULL ;
for ( l2 = 0 ; l2 < 512 ; l2 + + ) {
cpu_physical_memory_read ( pdp_addr + l2 * 8 , & pdpe , 8 ) ;
pdpe = le64_to_cpu ( pdpe ) ;
pdpe = address_space_ldq_le ( as , pdp_addr + l2 * 8 , attrs , NULL ) ;
end = ( l0 < < 48 ) + ( l1 < < 39 ) + ( l2 < < 30 ) ;
if ( pdpe & PG_PRESENT_MASK ) {
prot = 0 ;
@ -503,8 +495,8 @@ static void mem_info_la57(Monitor *mon, CPUArchState *env, AddressSpace *as)
pd_addr = pdpe & 0x3fffffffff000ULL ;
for ( l3 = 0 ; l3 < 512 ; l3 + + ) {
cpu_physical_memory_read ( pd_addr + l3 * 8 , & pde , 8 ) ;
pde = le64_to_cpu ( pde ) ;
pde = address_space_ldq_le ( as , pd_addr + l3 * 8 ,
attrs , NULL ) ;
end = ( l0 < < 48 ) + ( l1 < < 39 ) + ( l2 < < 30 ) + ( l3 < < 21 ) ;
if ( pde & PG_PRESENT_MASK ) {
prot = 0 ;
@ -522,8 +514,8 @@ static void mem_info_la57(Monitor *mon, CPUArchState *env, AddressSpace *as)
pt_addr = pde & 0x3fffffffff000ULL ;
for ( l4 = 0 ; l4 < 512 ; l4 + + ) {
cpu_physical_memory_read ( pt_addr + l4 * 8 , & pte , 8 ) ;
pte = le64_to_cpu ( pte ) ;
pte = address_space_ldq_le ( as , pt_addr + l4 * 8 ,
attrs , NULL ) ;
end = ( l0 < < 48 ) + ( l1 < < 39 ) + ( l2 < < 30 ) +
( l3 < < 21 ) + ( l4 < < 12 ) ;
if ( pte & PG_PRESENT_MASK ) {