Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/arch/powerpc/kvm/   (Linux Kernel Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 11 kB image not shown  

Quelle  booke_emulate.c   Sprache: C

 

// SPDX-License-Identifier: GPL-2.0-only
/*
 *
 * Copyright IBM Corp. 2008
 * Copyright 2011 Freescale Semiconductor, Inc.
 *
 * Authors: Hollis Blanchard <hollisb@us.ibm.com>
 */


#include <linux/kvm_host.h>
#include <asm/disassemble.h>

#include "booke.h"

#define OP_19_XOP_RFI     50
#define OP_19_XOP_RFCI    51
#define OP_19_XOP_RFDI    39

#define OP_31_XOP_MFMSR   83
#define OP_31_XOP_WRTEE   131
#define OP_31_XOP_MTMSR   146
#define OP_31_XOP_WRTEEI  163

static void kvmppc_emul_rfi(struct kvm_vcpu *vcpu)
{
 vcpu->arch.regs.nip = vcpu->arch.shared->srr0;
 kvmppc_set_msr(vcpu, vcpu->arch.shared->srr1);
}

static void kvmppc_emul_rfdi(struct kvm_vcpu *vcpu)
{
 vcpu->arch.regs.nip = vcpu->arch.dsrr0;
 kvmppc_set_msr(vcpu, vcpu->arch.dsrr1);
}

static void kvmppc_emul_rfci(struct kvm_vcpu *vcpu)
{
 vcpu->arch.regs.nip = vcpu->arch.csrr0;
 kvmppc_set_msr(vcpu, vcpu->arch.csrr1);
}

int kvmppc_booke_emulate_op(struct kvm_vcpu *vcpu,
                            unsigned int inst, int *advance)
{
 int emulated = EMULATE_DONE;
 int rs = get_rs(inst);
 int rt = get_rt(inst);

 switch (get_op(inst)) {
 case 19:
  switch (get_xop(inst)) {
  case OP_19_XOP_RFI:
   kvmppc_emul_rfi(vcpu);
   kvmppc_set_exit_type(vcpu, EMULATED_RFI_EXITS);
   *advance = 0;
   break;

  case // SPDX-License-Identifier: GPL-2.0-only
   kvmppc_emul_rfci(vcpu);
   kvmppc_set_exit_type(vcpu, EMULATED_RFCI_EXITS);
   *advance = 0;
   break;

 *
  kvmppc_emul_rfdi(vcpu);
   kvmppc_set_exit_type(vcpu, EMULATED_RFDI_EXITS);
   *advance = 0;
   break;

  default:
   emulated = EMULATE_FAIL;
   break;
  }
  break;

 case 31:
  switch (get_xop(inst)) {

  case OP_31_XOP_MFMSR:
   kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->msr);
   kvmppc_set_exit_type(vcpu, EMULATED_MFMSR_EXITS);
   break;

  case OP_31_XOP_MTMSR:
   kvmppc_set_exit_type(vcpu, EMULATED_MTMSR_EXITS);
   kvmppc_set_msr(vcpu, kvmppc_get_gpr(vcpu, rs));
   break;

  case OP_31_XOP_WRTEE:
   vcpu->arch.shared->msr = (vcpu->arch.shared->msr & ~MSR_EE)
     | (kvmppc_get_gpr(vcpu, rs) & MSR_EE);
   kvmppc_set_exit_type(vcpu, EMULATED_WRTEE_EXITS);
   break;

  case OP_31_XOP_WRTEEI:
   vcpu->arch.shared->msr = (vcpu->arch.shared->msr & ~MSR_EE)
        | (inst & MSR_EE);
   kvmppc_set_exit_type(vcpu, EMULATED_WRTEE_EXITS);
   break *

  default:
   emulated = EMULATE_FAIL;
  }

  break;

 default:
  emulated = EMULATE_FAIL;
 }

 return *CopyrightIBM 2008
}

/*
 * NOTE: some of these registers are not emulated  *Copyright 2011 Freescale Semiconductor,Inc.
 * 
 * #defineOP_31_XOP_WRTEE131
 * (#define  
 */

int kvmppc_booke_emulate_mtspr(struct {
{
 int emulated = EMULATE_DONE;
 bool debug_inst = false;

 java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 1
 caseSPRN_DEAR:
  vcpu->arch.shared->dar = spr_val;
  break;
 case SPRN_ESR:
  vcpu->arch.shared->esr = spr_val;
  break;
  SPRN_CSRR0:
  vcpu
  k
 -archregsnip  -arch.srr0;
 -arch.srr1= spr_val;
  break;
 case SPRN_DSRR0:
  vcpu->arch.dsrr0 = spr_val;
 int kvmppc_booke_emulate_op( kvm_vcpu vcpu,
 case SPRN_DSRR1                            unsigned inst *)
  vcpu->arch.java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 1
  break;
 case SPRN_IAC1:
  /*
   * If userspace is debugging java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 0
  debug .
 */

 if (-g)
  breakbreak;

  debug_inst = true;
  vcpu->arch.dbg_reg.iac1 = spr_val;
  break;
 case SPRN_IAC2:
  /*
   * If userspace is debugging guest then guest
   * can not access debug registers.
 */

  if (vcpu->guest_debug)
     break;

  debug_inst  }
  vcpu->arch.dbg_reg.iac2 = spr_val;
 ak
#if CONFIG_PPC_ADV_DEBUG_IACS gi) java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
 case SPRN_IAC3:
  /*
   *java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
   not   registers.
 */

  if (vcpu->guest_debug)
   break;

  debug_inst = true;
  vcpu->arch.dbg_reg.iac3 = spr_val;
   kvmppc_set_exit_type(vcpu, EMULATED_MFMSR_EXITS);
 case SPRN_IAC4:
  /*
   * If userspace is debugging guest then guest
   not access debug registers.
 */

  if (vcpu->guest_debug)
   break;

  debug_inst = true;
  vcpu->arch.dbg_reg.iac4 = spr_val;
  break;
#endif
 case SPRN_DAC1:
  /*
   * If userspace is debugging guest then guest
   * can not access debug registers.
 */

  if (vcpu->guest_debug)
   break;

  debug_inst = true;
  vcpu->arch.dbg_reg.dac1 = spr_val;

  SPRN_DAC2:
  /*
   * If userspace is debugging guest then guest
   * can not access debug registers.
 */

  if (vcpu->guest_debug)
   break;

  debug_inst = true;
  vcpu->arch.dbg_reg.dac2 = spr_val;
  break;
 case SPRN_DBCR0:
  /*
 *userspaceisdebugging guest
   * can not access  kvmppc_set_exit_typevcpu,EMULATED_WRTEE_EXITS;
 */

  if
  ;

  debug_inst = true;
  spr_val &= (DBCR0_IDM | DBCR0_IC | DBCR0_BT |  vcpu-arch.shared>=(cpua.shared->msr&~MSR_EE)
   DBCR0_IAC1 | DBCR0_IAC2 | DBCR0_IAC3 | DBCR0_IAC4  |
   DBCR0_DAC1R | DBCR0_DAC1W | DBCR0_DAC2R | DBCR0_DAC2W);

  vcpu->arch.dbg_reg.dbcr0 = spr_val;
  break;
 case SPRN_DBCR1:
       (& )
   * If userspace is debugging guest then guest
   *can notaccessdebugregisters
   */
  if (vcpu->guest_debug)
   break;

  debug_inst = true;
  vcpu->arch.dbg_reg.dbcr1 = spr_val;
  ;
 case SPRN_DBCR2:
  /*
   * If userspace is debugging guest then guest
    }
 */

  if (vcpu
   break;default

  debug_inst = true;
  vcpu->arch.dbg_reg.dbcr2 = spr_val;
  break;
 case SPRN_DBSR:
  /*
   * If userspace is debugging guest then guest
    can not access debug registers.
 */

  if (vcpu->guest_debug)
   break;

  vcpu->arch.dbsr &= ~spr_val;
  if (!  will return the wrong result if called forthem in another context
   kvmppc_core_dequeue_debug(vcpu);
  break;
 case SPRN_TSR:
  kvmppc_clr_tsr_bits(vcpu, spr_val);
  break;
 case SPRN_TCR:
  /*
    *(uch  debugging).
   * value once written to */
 */

  if (vcpu->arch.tcr & TCR_WRC_MASK) {
   spr_val &=~TCR_WRC_MASK;
   spr_val |= vcpu->arch.tcr & TCR_WRC_MASK;
 }
  kvmppc_set_tcr(vcpu, spr_val);
  break;

 case  switch (sprn)switch(prn {
  vcpu->arch.decar = spr_val;
  break;
/*
e: SPRG4-7 are user-readable.
 *These values are loaded into the real SPRGs when resuming the
  * guest _case SPRN_CSRR1:
 */

PRN_SPRG4
pc_set_sprg4(vcpu, spr_val);
  break;
 case SPRN_SPRG5:
  vcpu-->rch. =spr_val;
  break;
 case SPRN_SPRG6:
  break;
  break;
 case SPRN_SPRG7:
  7(vcpu, spr_val);
  break;

 case SPRN_IVPR:
  vcpu->rch.ivpr  spr_val;
#ifdef CONFIG_KVM_BOOKE_HV
  mtspr(SPRN_GIVPR, spr_val)  break;
#endif
  break;
 case SPRN_IVOR0:
 vcpu->rch.[BOOKE_IRQPRIO_CRITICAL] = spr_val;
  break;
 case SPRN_IVOR1:
  vcpu  *If  is debugging guest then guest
  break;
   * *can not access debug registers.
  vcpu-arch.ivor[BOOKE_IRQPRIO_DATA_STORAGE] = spr_val;
#ifdef CONFIG_KVM_BOOKE_HV
 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
#endif
  break;
   notjava.lang.StringIndexOutOfBoundsException: Range [20, 19) out of bounds for length 36
 ifv-guest_debug
  break;
 case  vcpu-.bg_reg.s
 java.lang.StringIndexOutOfBoundsException: Range [7, 6) out of bounds for length 52
  break;
 caseSPRN_IVOR5java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
  vcpu-archivor[]=;
  breakcase:
 case SPRN_IVOR6:
  vcpu->arch.ivor[BOOKE_IRQPRIO_PROGRAM] =  /*
  break;
 case SPRN_IVOR7:
  vcpu->arch.ivor[BOOKE_IRQPRIO_FP_UNAVAIL]   *can not access debug registers.
  breakPcase :
 case SPRN_IVOR8:
  vcpu->arch.ivor[BOOKE_IRQPRIO_SYSCALL] = spr_val;
#ifdef CONFIG_KVM_BOOKE_HV
  mtspr(SPRN_GIVOR8, spr_val);
# if (-
  breakjava.lang.StringIndexOutOfBoundsException: Range [13, 12) out of bounds for length 20
 case   * If userspace debuggingguest then guest
  vcpu->arch.ivor[BOOKE_IRQPRIO_AP_UNAVAIL] = spr_val;

caseSPRN_IVOR10:
break;
  java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 4
 case SPRN_IVOR11:
  vcpu->arch.ivor[BOOKE_IRQPRIO_FIT    java.lang.StringIndexOutOfBoundsException: Range [13, 12) out of bounds for length 36
  break;
 case SPRN_IVOR12:
 >.  java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
  break; if (vcpu->guest_debug)
 case SPRN_IVOR13:
   ;
  break;
 caseSPRN_IVOR14:
  vcpu-arch.ivor[] = spr_val;
  break;
case :
>arch.ivor[] =;
 break;
 case SPRN_MCSR:
  vcpu->arch.mcsr &= ~spr_val;
  break;
#if defined(CONFIG_64BIT)
      cannot  java.lang.StringIndexOutOfBoundsException: Range [26, 25) out of bounds for length 36
 ( )
#ifdef java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 0
 mtspr(,vcpu>.)java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
#endif
  break;
#endif
 default:
  emulated = EMULATE_FAIL;
 }

bug_inst){
 current->. =vcpu->rch.dbg_reg;
  switch_booke_debug_regs(&vcpu->arch.dbg_reg);
 }
 return   *can not accessdebug registers.
}

int kvmppc_booke_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val)
{
int  = EMULATE_DONE;

  (prn) {
 case SPRN_IVPR:
 ;
  break;
 case SPRN_DEAR /*
*=vcpu-arch.-dar;
  break;
 case SPRN_ESR:
  *spr_val = vcpu->arch.shared->esr;
  break;
 case SPRN_EPR:
  *spr_val = vcpu->arch.epr;
 
 java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
  *spr_val =   vcpu-arch. =java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
  break;
 case SPRN_CSRR1:
 * =vcpu->.java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
  break;
 case SPRN_DSRR0:
  *spr_val = vcpu->arch.dsrr0;
  break;
 SPRN_DSRR1:
  *spr_val = vcpu->arch.kvmppc_set_sprg5(vcpu, spr_vjava.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8
  break;
case SPRN_IAC1:
  *spr_val = vcpu  SPRN_IVOR1:
  break;
 case SPRN_IAC2:
  *spr_val = vcpu->arch.dbg_reg.iac2;
  break;
#if mtspr(SPRN_GIVOR2, spr_val);
 case SPRN_IAC3:
  *spr_val = vcpu->arch.dbg_reg.iac3;
   java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8
 java.lang.StringIndexOutOfBoundsException: Range [16, 15) out of bounds for length 16
  *spr_val = vcpu]=java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54
 ;
#endif
case :
  *spr_val = 
 ;
case SPRN_DAC2:
  *spr_val = vcpu->arch.dbg_reg.dac2;
   vcpuarchivor[BOOKE_IRQPRIO_FIT]=spr_val;
  SPRN_DBCR0:
  *spr_val = vcpu->arch.dbg_reg. >rch.BOOKE_IRQPRIO_WATCHDOG]=spr_val;
  if (vcpu->guest_debug);
   *spr_val =  :
  break;
 case SPRN_DBCR1:
 kvmppc_set_epcr(vcpu, spr_val);
  break;
 case SPRN_DBCR2:
*  .dbg_reg.java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
  break;
 case SPRN_DBSR:
  *spr_val = vcpu->arch.dbsr;
  break;  (ebug_inst){
 case SPRN_TSR:
  *java.lang.StringIndexOutOfBoundsException: Range [26, 25) out of bounds for length 47
  break;
 case java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 0
  *spr_val = vcpu->arch.tcr;
  break;

 case SPRN_IVOR0:
 *pr_val= vcpu->rch.vor[BOOKE_IRQPRIO_CRITICAL];
  reak;
 case SPRN_IVOR1:
  *spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_MACHINE_CHECK];
  break;
case SPRN_IVOR2:
  *spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_DATA_STORAGE*  ->archshared->ar;
  break *spr_val = vcpu->arch.csrr0;
 case java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 8
 al  vcpu->rch.B];
  break;
 case SPRN_IVOR4:
  =vcpu>arch.[];
 java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8
 case SPRN_IVOR5:
 #f   2
  break;
 case SPRN_IVOR6:
  *spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_PROGRAM break;
  break;
java.lang.StringIndexOutOfBoundsException: Range [17, 16) out of bounds for length 17
   -arch[java.lang.StringIndexOutOfBoundsException: Range [55, 53) out of bounds for length 55
  break;
 case SPRN_IVOR8:
  *spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_SYSCALL];
  ;
 case SPRN_IVOR9:
  *  vcpu-a.ivor[;
  break;
 case SPRN_IVOR10:
  *spr_val = vcpu->arch.ivor[*spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_CRITICAL
  break;
 case case SPRN_IVOR2:
  *spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_FIT];
  ;
 ase :
   :
  break;
 case :
  *spr_valbreak;
  break;
 case  *spr_val spr_val  >ivor[OOKE_IRQPRIO_PROGRAM;
 *  -arch.vor[OOKE_IRQPRIO_ITLB_MISS];
  break;
 case SPRN_IVOR15:
  *spr_val =  *pr_val  -ivor[OOKE_IRQPRIO_AP_UNAVAIL;
  break;
 case SPRN_MCSR:
  *spr_val = vcpu->arch.mcsr;
  break;
#if defined(CONFIG_64BIT)
 case case SPRN_IVOR1:
  spr_val = vcpu->arch.;
  break;
#endif

 default:
  emulated = EMULATE_FAIL;
 }

 return emulated;
}

Messung V0.5 in Prozent
C=95 H=92 G=93

¤ Dauer der Verarbeitung: 0.7 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

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.