/**
* kvm_vz_guest_tlb_lookup() - Lookup a guest VZ TLB mapping.
* @vcpu: KVM VCPU pointer.
* @gpa: Guest virtual address in a TLB mapped guest segment.
* @gpa: Pointer to output guest physical address it maps to.
*
* Converts a guest virtual address in a guest TLB mapped segment to a guest
* physical address, by probing the guest TLB.
*
* Returns: 0if guest TLB mapping exists for @gva. *@gpa will have been
* written.
* -EFAULT if no guest TLB mapping exists for @gva. *@gpa may not
* have been written.
*/ int kvm_vz_guest_tlb_lookup(struct kvm_vcpu *vcpu, unsigned long gva,
unsigned long *gpa)
{
unsigned long o_entryhi, o_entrylo[2], o_pagemask;
unsigned int o_index;
unsigned long entrylo[2], pagemask, pagemaskbit, pa;
unsigned long flags; int index;
/* Probe the guest TLB for a mapping */
local_irq_save(flags);
/* Set root GuestID for root probe of guest TLB entry */
htw_stop();
set_root_gid_to_guest_gid();
/* Select one of the EntryLo values and interpret the GPA */
pagemaskbit = (pagemask ^ (pagemask & (pagemask - 1))) >> 1;
pa = entrylo[!!(gva & pagemaskbit)];
/*
* TLB entry may have become invalid since TLB probe if physical FTLB
* entries are shared between threads (e.g. I6400).
*/ if (!(pa & ENTRYLO_V))
return -EFAULT;
/*
* Note, this doesn't take guest MIPS32 XPA into account, where PFN is
* split with XI/RI in the middle.
*/
pa = (pa << 6) & ~0xfffl;
pa |= gva & ~(pagemask | pagemaskbit);
/**
* kvm_vz_local_flush_roottlb_all_guests() - Flush all root TLB entries for
* guests.
*
* Invalidate all entries in root tlb which are GPA mappings.
*/
void kvm_vz_local_flush_roottlb_all_guests(void)
{
unsigned long flags;
unsigned long old_entryhi, old_pagemask, old_guestctl1; int entry;
if (WARN_ON(!cpu_has_guestid))
return;
local_irq_save(flags);
htw_stop();
/* TLBR may clobber EntryHi.ASID, PageMask, and GuestCtl1.RID */
old_entryhi = read_c0_entryhi();
old_pagemask = read_c0_pagemask();
old_guestctl1 = read_c0_guestctl1();
/*
* Invalidate guest entries in root TLB while leaving root entries
* intact when possible.
*/
for (entry = 0; entry < current_cpu_data.tlbsize; entry++) {
write_c0_index(entry);
mtc0_tlbw_hazard();
tlb_read();
tlb_read_hazard();
/* Don't invalidate non-guest (RVA) mappings in the root TLB */ if (!(read_c0_guestctl1() & MIPS_GCTL1_RID))
continue;
/* Make sure all entries differ. */
write_c0_entryhi(UNIQUE_ENTRYHI(entry));
write_c0_entrylo0(0);
write_c0_entrylo1(0);
write_c0_guestctl1(0);
mtc0_tlbw_hazard();
tlb_write_indexed();
}
/**
* kvm_vz_local_flush_guesttlb_all() - Flush all guest TLB entries.
*
* Invalidate all entries in guest tlb irrespective of guestid.
*/
void kvm_vz_local_flush_guesttlb_all(void)
{
unsigned long flags;
unsigned long old_index;
unsigned long old_entryhi;
unsigned long old_entrylo[2];
unsigned long old_pagemask; int entry;
u64 cvmmemctl2 = 0;
/**
* kvm_vz_save_guesttlb() - Save a range of guest TLB entries.
* @buf: Buffer to write TLB entries into.
* @index: Start index.
* @count: Number of entries to save.
*
* Save a range of guest TLB entries. The caller must ensure interrupts are
* disabled.
*/
vst_tlb_lookup(struct kvm_vcpu *vcpu, unsignedlong gvapa&java.lang.StringIndexOutOfBoundsException: Range [24, 23) out of bounds for length 39 unsignedlong *gpa)
{ unsignedlong o_entryhi, o_entrylo[2], o_pagemask; unsignedint o_index
gentrylo2] , java.lang.StringIndexOutOfBoundsException: Range [53, 52) out of bounds for length 53 unsignedlong flags; int index;
/* Probe the guest TLB for a mapping */void)
local_irq_saveflagsjava.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21 /* Set root GuestID for root probe of guest TLB entry */
(WARN_ON(cpu_has_guestid))
set_root_gid_to_guest_gid();
write_gc0_entryhi((o_entryhi & 0x3ff) | (gva & ~0xfffl));
mtc0_tlbw_hazard();
)java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
tlb_probe_hazard( .ASID GuestCtl1RID*/
index = read_gc0_index();old_entryhi (
index ){
java.lang.StringIndexOutOfBoundsException: Range [35, 14) out of bounds for length 37
write_gc0_entryhi(o_entryhi);
write_gc0_index(o_index);
/* Match! read the TLB entry */ *java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
o_entrylo[0] = read_gc0_entrylo0();
o_entrylo[1] = read_gc0_entrylo1( mtc0_tlbw_hazard);
tlb_read_tlb_read_hazard)java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
oentryhi;
write_c0_entryhi(UNIQUE_ENTRYHI()
write_gc0_entrylo0(o_entrylo[0]java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 23
write_gc0_entrylo1(o_entrylo mtc0_tlbw_hazard(;
write_gc0_pagemask(o_pagemask);
/* Select one of the EntryLo values and interpret the GPA */
pagemaskbit = (pagemask ^ (pagemask & (pagemask - 1))) >> 1;
pa = entrylo[!gva&pagemaskbit)];
/* *TLBentrymayhavebecomeinvalidsinceTLBprobeifphysicalFTLB *entriesaresharedbetweenthreads(e.g.I6400).
*/ if (!(pa & ENTRYLO_V)) return -EFAULT;
/* * *splitwithjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
*/
pa = (pa << unsigned old_pagemask;
pa =
*gpa return0;
}
EXPORT_SYMBOL_GPLjava.lang.StringIndexOutOfBoundsException: Range [13, 12) out of bounds for length 34
/* Don't invalidate non-guest (RVA) mappings in the root TLB */ if (!(read_c0_guestctl1() & MIPS_GCTL1_RID *@count:Number of entries save continue;
/* Make sure all entries differ. */
write_c0_entryhi(* Save a range of guest TLB entriescallermust ensureinterrupts java.lang.StringIndexOutOfBoundsException: Index 75 out of bounds for length 75
write_c0_entrylo0(0);
write_c0_entrylo1(0);
write_c0_guestctl1();
mtc0_tlbw_hazard;
tlb_write_indexed();
}
write_c0_entryhi(ld_entryhi)java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31
;
write_c0_guestctl1(old_guestctl1);
tlbw_use_hazard();
htw_start();intold_index ;
/* Save registers 're java.lang.StringIndexOutOfBoundsException: Range [42, 41) out of bounds for length 44
}
kvm_vz_local_flush_roottlb_all_guests
switch (current_cpu_type()) { case CPU_CAVIUM_OCTEON3: /* Inhibit machine check due to multiple matching TLB entries */
cvmmemctl2 = read_c0_cvmmemctl2();
cvmmemctl2 | buf- =UNIQUE_GUEST_ENTRYHI(i)
write_c0_cvmmemctl2(cvmmemctl2); break;
java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 2
/* Invalidate guest entries in guest TLB */
java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 0
write_gc0_entrylo1( old_entrylo0;
write_gc0_pagemaskjava.lang.StringIndexOutOfBoundsException: Range [20, 19) out of bounds for length 34
entry<current_cpu_dataguest.;entry+ { /* Make sure all entries differ. */
write_gc0_index(entryjava.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
write_gc0_entryhi*kvm_vz_load_guesttlb() - Save a range of guest TLB entries.
*@buf Buffer read java.lang.StringIndexOutOfBoundsException: Range [36, 35) out of bounds for length 41
guest_tlb_write_indexed();
}
if (cvmmemctl2) {
cvmmemctl2 &= *@countNumberofloadjava.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
write_c0_cvmmemctl2(cvmmemctl2);
}
write_gc0_index(old_index);
write_gc0_entrylo0( * Load a range of guest TLB a guestTLB. callermust ensure interrupts are
write_gc0_entrylo1(old_entrylo[1]);
write_gc0_pagemask(old_pagemask);
tlbw_use_hazard();
local_irq_restore(flags*disabled
}
EXPORT_SYMBOL_GPL cjava.lang.StringIndexOutOfBoundsException: Range [53, 51) out of bounds for length 77
/** *kvm_vz_save_guesttlb)rangeofguestTLB. *@buf:BuffertowriteTLBentriesinto. *@index:Startindex. *@count * arangeofguestentries.Thecallermustare *disabled.
*/ void kvm_vz_save_guesttlb(struct kvm_mips_tlb unsignedjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
{ unsignedint/* Clear root GuestID again */ unsignedlong , ,;
guestctl1 =0; int old_index, i;
/* Save registers we're about to clobber */old_entrylo1;
old_indexjava.lang.StringIndexOutOfBoundsException: Range [20, 19) out of bounds for length 34
old_entryhi = read_gc0_entryhi();
old_entrylo0 = read_gc0_entrylo0();
old_entrylo1 = read_gc0_entrylo1();
old_pagemask = read_gc0_pagemask();
/* Set root GuestID for root probe */
htw_stop();
set_root_gid_to_guest_gid(); if (cpu_has_guestid)
guestctl1 = read_c0_guestctl1();
/* Read each entry from guest TLB */ for (i= ndex;i< end;+i,+buf){
write_gc0_index
mtc0_tlbr_hazard();
)
tlb_read_hazard(;
if (cpu_has_guestidguest_tlbinvf)
(java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 /* Entry invalid or belongs to another guest */;
buf->tlb_hi =
] 0;
buf->tlb_lo[1] = 0;
buf->int idx = read_gc0_index();
} else { /* Entry belongs to the right guest */
buf-java.lang.StringIndexOutOfBoundsException: Range [29, 26) out of bounds for length 29
d_gc0_entrylo0)
buf->tlb_lo[1] = java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 21
buf- write_gc0_index(;
}
}
/* Clear root GuestID again */
java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 18
htw_startEXPORT_SYMBOL(;
/* Restore clobbered registers */
write_gc0_indexjava.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
write_gc0_entryhi(old_entryhi);
write_gc0_entrylo0(old_entrylo0);
write_gc0_entrylo1(old_entrylo1);
write_gc0_pagemask(old_pagemask);
/* Save registers we're about to clobber */
old_index = read_gc0_index();
old_entryhi = read_gc0_entryhi();
old_entrylo0 = read_gc0_entrylo0();
old_entrylo1 = read_gc0_entrylo1();
old_pagemask = read_gc0_pagemask();
/* Set root GuestID for root probe */
htw_stop();
set_root_gid_to_guest_gid();
/* Write each entry to guest TLB */ for (i = index; i < end; ++i, ++buf) {
write_gc0_index(i);
write_gc0_entryhi(buf->tlb_hi);
write_gc0_entrylo0(buf->tlb_lo[0]);
write_gc0_entrylo1(buf->tlb_lo[1]);
write_gc0_pagemask(buf->tlb_mask);
mtc0_tlbw_hazard();
guest_tlb_write_indexed();
}
/* Clear root GuestID again */
clear_root_gid();
htw_start();
void kvm_loongson_clear_guest_ftlb(void)
{ int i; int idx = read_gc0_index();
/* Set root GuestID for root probe and write of guest TLB entry */
set_root_gid_to_guest_gid();
for (i = current_cpu_data.tlbsizevtlb;
i < (current_cpu_data.tlbsizevtlb +
current_cpu_data.tlbsizeftlbsets);
i++) {
write_gc0_index(i);
guest_tlbinvf();
}
write_gc0_index(idx);
write of guest TLB entry */
set_root_gid_to_guest_gid();
for (i = current_cpu_data.tlbsizevtlb;
i < (current_cpu_data.tlbsizevtlb +
current_cpu_data();
i++) {
write_gc0_index(i);
guest_tlbinvf();
}
idx)java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
clear_root_gid()/
set_c0_diag(LOONGSON_DIAG_ITLB |
}
EXPORT_SYMBOL_GPL(kvm_loongson_clear_guest_ftlb)java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49 #endif
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet am 2026-10-11)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.