Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

booke: Added ONE_REG interface for IAC/DAC debug registers

IAC/DAC are defined as 32 bit while they are 64 bit wide. So ONE_REG
interface is added to set/get them.

Signed-off-by: Bharat Bhushan <bharat.bhushan@freescale.com>
Signed-off-by: Alexander Graf <agraf@suse.de>

authored by

Bharat Bhushan and committed by
Alexander Graf
6df8d3fc f61c94bb

+84 -8
+12
arch/powerpc/include/asm/kvm.h
··· 221 221 222 222 __u32 dbsr; /* KVM_SREGS_E_UPDATE_DBSR */ 223 223 __u32 dbcr[3]; 224 + /* 225 + * iac/dac registers are 64bit wide, while this API 226 + * interface provides only lower 32 bits on 64 bit 227 + * processors. ONE_REG interface is added for 64bit 228 + * iac/dac registers. 229 + */ 224 230 __u32 iac[4]; 225 231 __u32 dac[2]; 226 232 __u32 dvc[2]; ··· 332 326 }; 333 327 334 328 #define KVM_REG_PPC_HIOR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x1) 329 + #define KVM_REG_PPC_IAC1 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x2) 330 + #define KVM_REG_PPC_IAC2 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x3) 331 + #define KVM_REG_PPC_IAC3 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x4) 332 + #define KVM_REG_PPC_IAC4 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x5) 333 + #define KVM_REG_PPC_DAC1 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x6) 334 + #define KVM_REG_PPC_DAC2 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x7) 335 335 336 336 #endif /* __LINUX_KVM_POWERPC_H */
+22 -2
arch/powerpc/include/asm/kvm_host.h
··· 346 346 bool class : 1; 347 347 }; 348 348 349 + # ifdef CONFIG_PPC_FSL_BOOK3E 350 + #define KVMPPC_BOOKE_IAC_NUM 2 351 + #define KVMPPC_BOOKE_DAC_NUM 2 352 + # else 353 + #define KVMPPC_BOOKE_IAC_NUM 4 354 + #define KVMPPC_BOOKE_DAC_NUM 2 355 + # endif 356 + #define KVMPPC_BOOKE_MAX_IAC 4 357 + #define KVMPPC_BOOKE_MAX_DAC 2 358 + 359 + struct kvmppc_booke_debug_reg { 360 + u32 dbcr0; 361 + u32 dbcr1; 362 + u32 dbcr2; 363 + #ifdef CONFIG_KVM_E500MC 364 + u32 dbcr4; 365 + #endif 366 + u64 iac[KVMPPC_BOOKE_MAX_IAC]; 367 + u64 dac[KVMPPC_BOOKE_MAX_DAC]; 368 + }; 369 + 349 370 struct kvm_vcpu_arch { 350 371 ulong host_stack; 351 372 u32 host_pid; ··· 461 440 462 441 u32 ccr0; 463 442 u32 ccr1; 464 - u32 dbcr0; 465 - u32 dbcr1; 466 443 u32 dbsr; 467 444 468 445 u64 mmcr[3]; ··· 495 476 u32 tlbcfg[4]; 496 477 u32 mmucfg; 497 478 u32 epr; 479 + struct kvmppc_booke_debug_reg dbg_reg; 498 480 #endif 499 481 gpa_t paddr_accessed; 500 482 gva_t vaddr_accessed;
+46 -2
arch/powerpc/kvm/booke.c
··· 1351 1351 1352 1352 int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg) 1353 1353 { 1354 - return -EINVAL; 1354 + int r = -EINVAL; 1355 + 1356 + switch (reg->id) { 1357 + case KVM_REG_PPC_IAC1: 1358 + case KVM_REG_PPC_IAC2: 1359 + case KVM_REG_PPC_IAC3: 1360 + case KVM_REG_PPC_IAC4: { 1361 + int iac = reg->id - KVM_REG_PPC_IAC1; 1362 + r = copy_to_user((u64 __user *)(long)reg->addr, 1363 + &vcpu->arch.dbg_reg.iac[iac], sizeof(u64)); 1364 + break; 1365 + } 1366 + case KVM_REG_PPC_DAC1: 1367 + case KVM_REG_PPC_DAC2: { 1368 + int dac = reg->id - KVM_REG_PPC_DAC1; 1369 + r = copy_to_user((u64 __user *)(long)reg->addr, 1370 + &vcpu->arch.dbg_reg.dac[dac], sizeof(u64)); 1371 + break; 1372 + } 1373 + default: 1374 + break; 1375 + } 1376 + return r; 1355 1377 } 1356 1378 1357 1379 int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg) 1358 1380 { 1359 - return -EINVAL; 1381 + int r = -EINVAL; 1382 + 1383 + switch (reg->id) { 1384 + case KVM_REG_PPC_IAC1: 1385 + case KVM_REG_PPC_IAC2: 1386 + case KVM_REG_PPC_IAC3: 1387 + case KVM_REG_PPC_IAC4: { 1388 + int iac = reg->id - KVM_REG_PPC_IAC1; 1389 + r = copy_from_user(&vcpu->arch.dbg_reg.iac[iac], 1390 + (u64 __user *)(long)reg->addr, sizeof(u64)); 1391 + break; 1392 + } 1393 + case KVM_REG_PPC_DAC1: 1394 + case KVM_REG_PPC_DAC2: { 1395 + int dac = reg->id - KVM_REG_PPC_DAC1; 1396 + r = copy_from_user(&vcpu->arch.dbg_reg.dac[dac], 1397 + (u64 __user *)(long)reg->addr, sizeof(u64)); 1398 + break; 1399 + } 1400 + default: 1401 + break; 1402 + } 1403 + return r; 1360 1404 } 1361 1405 1362 1406 int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
+4 -4
arch/powerpc/kvm/booke_emulate.c
··· 133 133 vcpu->arch.csrr1 = spr_val; 134 134 break; 135 135 case SPRN_DBCR0: 136 - vcpu->arch.dbcr0 = spr_val; 136 + vcpu->arch.dbg_reg.dbcr0 = spr_val; 137 137 break; 138 138 case SPRN_DBCR1: 139 - vcpu->arch.dbcr1 = spr_val; 139 + vcpu->arch.dbg_reg.dbcr1 = spr_val; 140 140 break; 141 141 case SPRN_DBSR: 142 142 vcpu->arch.dbsr &= ~spr_val; ··· 266 266 *spr_val = vcpu->arch.csrr1; 267 267 break; 268 268 case SPRN_DBCR0: 269 - *spr_val = vcpu->arch.dbcr0; 269 + *spr_val = vcpu->arch.dbg_reg.dbcr0; 270 270 break; 271 271 case SPRN_DBCR1: 272 - *spr_val = vcpu->arch.dbcr1; 272 + *spr_val = vcpu->arch.dbg_reg.dbcr1; 273 273 break; 274 274 case SPRN_DBSR: 275 275 *spr_val = vcpu->arch.dbsr;