Re: [PATCH v16 00/23] i386 cleanup PART 2

2021-03-15 Thread Philippe Mathieu-Daudé
On 3/15/21 10:44 AM, Claudio Fontana wrote:
> Hi Philippe,
> 
> On 3/14/21 1:00 AM, Philippe Mathieu-Daudé wrote:
>> Hi Claudio,

>>
>> I am looking at this code:
>>
>> $ git grep tcg_ softmmu/physmem.c
>> softmmu/physmem.c:153:static void
>> tcg_log_global_after_sync(MemoryListener *listener);
>> softmmu/physmem.c:154:static void tcg_commit(MemoryListener *listener);
>> softmmu/physmem.c:161: * @tcg_as_listener: listener for tracking changes
>> to the AddressSpace
>> softmmu/physmem.c:167:MemoryListener tcg_as_listener;
>> softmmu/physmem.c:590:static void tcg_iommu_unmap_notify(IOMMUNotifier
>> *n, IOMMUTLBEntry *iotlb)
>> softmmu/physmem.c:606:static void tcg_register_iommu_notifier(CPUState *cpu,
>> softmmu/physmem.c:640:tcg_iommu_unmap_notify,
>> softmmu/physmem.c:654:void tcg_iommu_free_notifier_list(CPUState *cpu)
>> softmmu/physmem.c:668:void tcg_iommu_init_notifier_list(CPUState *cpu)
>> softmmu/physmem.c:698:tcg_register_iommu_notifier(cpu, iommu_mr,
>> iommu_idx);
>> softmmu/physmem.c:761:if (tcg_enabled()) {
>> softmmu/physmem.c:762:
>> newas->tcg_as_listener.log_global_after_sync = tcg_log_global_after_sync;
>> softmmu/physmem.c:763:newas->tcg_as_listener.commit = tcg_commit;
>> softmmu/physmem.c:764:
>> memory_listener_register(>tcg_as_listener, as);
>> softmmu/physmem.c:891:assert(tcg_enabled());
>> softmmu/physmem.c:904:if (cc->tcg_ops->adjust_watchpoint_address) {
>> softmmu/physmem.c:906:addr =
>> cc->tcg_ops->adjust_watchpoint_address(cpu, addr, len);
>> softmmu/physmem.c:927:if (wp->flags & BP_CPU &&
>> cc->tcg_ops->debug_check_watchpoint &&
>> softmmu/physmem.c:928:
>> !cc->tcg_ops->debug_check_watchpoint(cpu, wp)) {
>> softmmu/physmem.c:1004:assert(tcg_enabled());
>> softmmu/physmem.c:1059:if (dirty && tcg_enabled()) {
>> softmmu/physmem.c:1107:if (tcg_enabled()) {
>> softmmu/physmem.c:2605:static void
>> tcg_log_global_after_sync(MemoryListener *listener)
>> softmmu/physmem.c:2634:cpuas = container_of(listener,
>> CPUAddressSpace, tcg_as_listener);
>> softmmu/physmem.c:2639:static void tcg_commit(MemoryListener *listener)
>> softmmu/physmem.c:2644:assert(tcg_enabled());
>> softmmu/physmem.c:2647:cpuas = container_of(listener,
>> CPUAddressSpace, tcg_as_listener);
>> softmmu/physmem.c:2700:assert(tcg_enabled());
>> softmmu/physmem.c:3000:if (tcg_enabled()) {
>>
>> which reminded me the starter generic part of your effort
>> (already merged).
>>
>> Do you have plans for this code?
>>
>> Similarly:
>>
>> $ git grep kvm_ softmmu/physmem.c
>> softmmu/physmem.c:752:assert(asidx == 0 || !kvm_enabled());
>> softmmu/physmem.c:1295:if (kvm_enabled())
>> softmmu/physmem.c:1296:kvm_flush_coalesced_mmio_buffer();
>> softmmu/physmem.c:1566:if (kvm_enabled()) {
>> softmmu/physmem.c:2046:if (kvm_enabled() && !kvm_has_sync_mmu()) {
>>
>> Thanks,
>>
>> Phil.
>>
> 
> Hi Phil,
> 
> indeed it is a juicy target for splitting things between TCG-only and non-TCG 
> code,
> specifically as we discovered that we don't need any of the watchpoint stuff 
> outside of TCG.
> 
> I think I am tied up in the ARM code for a while,
> so if you are asking because you want to start there, just go ahead,
> I'll try to review, otherwise I'll get back to it (and to i386) later on.

No plan yet. I looked back at what I did + your patches to get
the big picture again, and had a look at my notes and wip patches.

Since you are making big changes/progress, I now prefer to check
upfront to avoid duplicated effort.

Regards,

Phil.



Re: [PATCH v16 00/23] i386 cleanup PART 2

2021-03-15 Thread Claudio Fontana
Hi Philippe,

On 3/14/21 1:00 AM, Philippe Mathieu-Daudé wrote:
> Hi Claudio,
> 
> On 2/4/21 5:39 PM, Claudio Fontana wrote:
>> v15 -> v16:
>>
>> * cpu: Move synchronize_from_tb() to tcg_ops:
>>   - adjusted comments (Alex)
>>
>> * cpu: tcg_ops: move to tcg-cpu-ops.h, keep a pointer in CPUClass:
>>   - remove forward decl. of AccelCPUClass, should be in a later patch. (Alex)
>>   - simplified comment about tcg_ops in struct CPUClass (Alex)
>>   - remove obsolete comment about ARM blocking TCGCPUOps from being const.
>> (Alex)
>>
>> * accel: replace struct CpusAccel with AccelOpsClass:
>>   - reworded commit message to be clearer about the objective (Alex)
>>
>> * accel: introduce AccelCPUClass extending CPUClass
>>   - reworded commit message to be clearer about the objective (Alex)
>>
>> * hw/core/cpu: call qemu_init_vcpu in cpu_common_realizefn:
>>   - dropped this patch (Alex, Philippe)
>>
>>   will try again later, also in the context of:
>>   https://www.mail-archive.com/qemu-devel@nongnu.org/msg686480.html
>>
>> * accel: introduce new accessor functions
>>   - squashed comments in previous patch introducing accel-cpu.h. (Philippe)
>>
>> * accel-cpu: make cpu_realizefn return a bool
>>   - split in two patches, separating the change to the phys_bits check
>> (Philippe)
> 
> I am looking at this code:
> 
> $ git grep tcg_ softmmu/physmem.c
> softmmu/physmem.c:153:static void
> tcg_log_global_after_sync(MemoryListener *listener);
> softmmu/physmem.c:154:static void tcg_commit(MemoryListener *listener);
> softmmu/physmem.c:161: * @tcg_as_listener: listener for tracking changes
> to the AddressSpace
> softmmu/physmem.c:167:MemoryListener tcg_as_listener;
> softmmu/physmem.c:590:static void tcg_iommu_unmap_notify(IOMMUNotifier
> *n, IOMMUTLBEntry *iotlb)
> softmmu/physmem.c:606:static void tcg_register_iommu_notifier(CPUState *cpu,
> softmmu/physmem.c:640:tcg_iommu_unmap_notify,
> softmmu/physmem.c:654:void tcg_iommu_free_notifier_list(CPUState *cpu)
> softmmu/physmem.c:668:void tcg_iommu_init_notifier_list(CPUState *cpu)
> softmmu/physmem.c:698:tcg_register_iommu_notifier(cpu, iommu_mr,
> iommu_idx);
> softmmu/physmem.c:761:if (tcg_enabled()) {
> softmmu/physmem.c:762:
> newas->tcg_as_listener.log_global_after_sync = tcg_log_global_after_sync;
> softmmu/physmem.c:763:newas->tcg_as_listener.commit = tcg_commit;
> softmmu/physmem.c:764:
> memory_listener_register(>tcg_as_listener, as);
> softmmu/physmem.c:891:assert(tcg_enabled());
> softmmu/physmem.c:904:if (cc->tcg_ops->adjust_watchpoint_address) {
> softmmu/physmem.c:906:addr =
> cc->tcg_ops->adjust_watchpoint_address(cpu, addr, len);
> softmmu/physmem.c:927:if (wp->flags & BP_CPU &&
> cc->tcg_ops->debug_check_watchpoint &&
> softmmu/physmem.c:928:
> !cc->tcg_ops->debug_check_watchpoint(cpu, wp)) {
> softmmu/physmem.c:1004:assert(tcg_enabled());
> softmmu/physmem.c:1059:if (dirty && tcg_enabled()) {
> softmmu/physmem.c:1107:if (tcg_enabled()) {
> softmmu/physmem.c:2605:static void
> tcg_log_global_after_sync(MemoryListener *listener)
> softmmu/physmem.c:2634:cpuas = container_of(listener,
> CPUAddressSpace, tcg_as_listener);
> softmmu/physmem.c:2639:static void tcg_commit(MemoryListener *listener)
> softmmu/physmem.c:2644:assert(tcg_enabled());
> softmmu/physmem.c:2647:cpuas = container_of(listener,
> CPUAddressSpace, tcg_as_listener);
> softmmu/physmem.c:2700:assert(tcg_enabled());
> softmmu/physmem.c:3000:if (tcg_enabled()) {
> 
> which reminded me the starter generic part of your effort
> (already merged).
> 
> Do you have plans for this code?
> 
> Similarly:
> 
> $ git grep kvm_ softmmu/physmem.c
> softmmu/physmem.c:752:assert(asidx == 0 || !kvm_enabled());
> softmmu/physmem.c:1295:if (kvm_enabled())
> softmmu/physmem.c:1296:kvm_flush_coalesced_mmio_buffer();
> softmmu/physmem.c:1566:if (kvm_enabled()) {
> softmmu/physmem.c:2046:if (kvm_enabled() && !kvm_has_sync_mmu()) {
> 
> Thanks,
> 
> Phil.
> 

Hi Phil,

indeed it is a juicy target for splitting things between TCG-only and non-TCG 
code,
specifically as we discovered that we don't need any of the watchpoint stuff 
outside of TCG.

I think I am tied up in the ARM code for a while,
so if you are asking because you want to start there, just go ahead,
I'll try to review, otherwise I'll get back to it (and to i386) later on.

Ciao,

Claudio




Re: [PATCH v16 00/23] i386 cleanup PART 2

2021-03-13 Thread Philippe Mathieu-Daudé
Hi Claudio,

On 2/4/21 5:39 PM, Claudio Fontana wrote:
> v15 -> v16:
> 
> * cpu: Move synchronize_from_tb() to tcg_ops:
>   - adjusted comments (Alex)
> 
> * cpu: tcg_ops: move to tcg-cpu-ops.h, keep a pointer in CPUClass:
>   - remove forward decl. of AccelCPUClass, should be in a later patch. (Alex)
>   - simplified comment about tcg_ops in struct CPUClass (Alex)
>   - remove obsolete comment about ARM blocking TCGCPUOps from being const.
> (Alex)
> 
> * accel: replace struct CpusAccel with AccelOpsClass:
>   - reworded commit message to be clearer about the objective (Alex)
> 
> * accel: introduce AccelCPUClass extending CPUClass
>   - reworded commit message to be clearer about the objective (Alex)
> 
> * hw/core/cpu: call qemu_init_vcpu in cpu_common_realizefn:
>   - dropped this patch (Alex, Philippe)
> 
>   will try again later, also in the context of:
>   https://www.mail-archive.com/qemu-devel@nongnu.org/msg686480.html
> 
> * accel: introduce new accessor functions
>   - squashed comments in previous patch introducing accel-cpu.h. (Philippe)
> 
> * accel-cpu: make cpu_realizefn return a bool
>   - split in two patches, separating the change to the phys_bits check
> (Philippe)

I am looking at this code:

$ git grep tcg_ softmmu/physmem.c
softmmu/physmem.c:153:static void
tcg_log_global_after_sync(MemoryListener *listener);
softmmu/physmem.c:154:static void tcg_commit(MemoryListener *listener);
softmmu/physmem.c:161: * @tcg_as_listener: listener for tracking changes
to the AddressSpace
softmmu/physmem.c:167:MemoryListener tcg_as_listener;
softmmu/physmem.c:590:static void tcg_iommu_unmap_notify(IOMMUNotifier
*n, IOMMUTLBEntry *iotlb)
softmmu/physmem.c:606:static void tcg_register_iommu_notifier(CPUState *cpu,
softmmu/physmem.c:640:tcg_iommu_unmap_notify,
softmmu/physmem.c:654:void tcg_iommu_free_notifier_list(CPUState *cpu)
softmmu/physmem.c:668:void tcg_iommu_init_notifier_list(CPUState *cpu)
softmmu/physmem.c:698:tcg_register_iommu_notifier(cpu, iommu_mr,
iommu_idx);
softmmu/physmem.c:761:if (tcg_enabled()) {
softmmu/physmem.c:762:
newas->tcg_as_listener.log_global_after_sync = tcg_log_global_after_sync;
softmmu/physmem.c:763:newas->tcg_as_listener.commit = tcg_commit;
softmmu/physmem.c:764:
memory_listener_register(>tcg_as_listener, as);
softmmu/physmem.c:891:assert(tcg_enabled());
softmmu/physmem.c:904:if (cc->tcg_ops->adjust_watchpoint_address) {
softmmu/physmem.c:906:addr =
cc->tcg_ops->adjust_watchpoint_address(cpu, addr, len);
softmmu/physmem.c:927:if (wp->flags & BP_CPU &&
cc->tcg_ops->debug_check_watchpoint &&
softmmu/physmem.c:928:
!cc->tcg_ops->debug_check_watchpoint(cpu, wp)) {
softmmu/physmem.c:1004:assert(tcg_enabled());
softmmu/physmem.c:1059:if (dirty && tcg_enabled()) {
softmmu/physmem.c:1107:if (tcg_enabled()) {
softmmu/physmem.c:2605:static void
tcg_log_global_after_sync(MemoryListener *listener)
softmmu/physmem.c:2634:cpuas = container_of(listener,
CPUAddressSpace, tcg_as_listener);
softmmu/physmem.c:2639:static void tcg_commit(MemoryListener *listener)
softmmu/physmem.c:2644:assert(tcg_enabled());
softmmu/physmem.c:2647:cpuas = container_of(listener,
CPUAddressSpace, tcg_as_listener);
softmmu/physmem.c:2700:assert(tcg_enabled());
softmmu/physmem.c:3000:if (tcg_enabled()) {

which reminded me the starter generic part of your effort
(already merged).

Do you have plans for this code?

Similarly:

$ git grep kvm_ softmmu/physmem.c
softmmu/physmem.c:752:assert(asidx == 0 || !kvm_enabled());
softmmu/physmem.c:1295:if (kvm_enabled())
softmmu/physmem.c:1296:kvm_flush_coalesced_mmio_buffer();
softmmu/physmem.c:1566:if (kvm_enabled()) {
softmmu/physmem.c:2046:if (kvm_enabled() && !kvm_has_sync_mmu()) {

Thanks,

Phil.



Re: [PATCH v16 00/23] i386 cleanup PART 2

2021-02-05 Thread Richard Henderson
On 2/4/21 6:39 AM, Claudio Fontana wrote:
> Claudio Fontana (18):
>   target/riscv: remove CONFIG_TCG, as it is always TCG
>   accel/tcg: split TCG-only code from cpu_exec_realizefn
>   target/arm: do not use cc->do_interrupt for KVM directly
>   cpu: move cc->do_interrupt to tcg_ops
>   cpu: move cc->transaction_failed to tcg_ops
>   cpu: move do_unaligned_access to tcg_ops
>   physmem: make watchpoint checking code TCG-only
>   cpu: move adjust_watchpoint_address to tcg_ops
>   cpu: move debug_check_watchpoint to tcg_ops
>   cpu: tcg_ops: move to tcg-cpu-ops.h, keep a pointer in CPUClass
>   accel: extend AccelState and AccelClass to user-mode
>   accel: replace struct CpusAccel with AccelOpsClass
>   accel: introduce AccelCPUClass extending CPUClass
>   i386: split cpu accelerators from cpu.c, using AccelCPUClass
>   cpu: call AccelCPUClass::cpu_realizefn in cpu_exec_realizefn
>   accel: introduce new accessor functions
>   target/i386: fix host_cpu_adjust_phys_bits error handling
>   accel-cpu: make cpu_realizefn return a bool
> 
> Eduardo Habkost (5):
>   cpu: Introduce TCGCpuOperations struct
>   cpu: Move synchronize_from_tb() to tcg_ops
>   cpu: Move cpu_exec_* to tcg_ops
>   cpu: Move tlb_fill to tcg_ops
>   cpu: Move debug_excp_handler to tcg_ops

Queuing patches 1-18 to tcg-next.


r~



[PATCH v16 00/23] i386 cleanup PART 2

2021-02-04 Thread Claudio Fontana
v15 -> v16:

* cpu: Move synchronize_from_tb() to tcg_ops:
  - adjusted comments (Alex)

* cpu: tcg_ops: move to tcg-cpu-ops.h, keep a pointer in CPUClass:
  - remove forward decl. of AccelCPUClass, should be in a later patch. (Alex)
  - simplified comment about tcg_ops in struct CPUClass (Alex)
  - remove obsolete comment about ARM blocking TCGCPUOps from being const.
(Alex)

* accel: replace struct CpusAccel with AccelOpsClass:
  - reworded commit message to be clearer about the objective (Alex)

* accel: introduce AccelCPUClass extending CPUClass
  - reworded commit message to be clearer about the objective (Alex)

* hw/core/cpu: call qemu_init_vcpu in cpu_common_realizefn:
  - dropped this patch (Alex, Philippe)

  will try again later, also in the context of:
  https://www.mail-archive.com/qemu-devel@nongnu.org/msg686480.html

* accel: introduce new accessor functions
  - squashed comments in previous patch introducing accel-cpu.h. (Philippe)

* accel-cpu: make cpu_realizefn return a bool
  - split in two patches, separating the change to the phys_bits check
(Philippe)

v14 -> v15:

* change the TcgCpuOperations so that all fields of the struct are
  defined unconditionally, as per original patch by Eduardo,
  before moving them to a separate struct referenced by a pointer
  (Richard, Eduardo).

* changed (c) year to 2021

* added a patch to make accel_cpu->cpu_realizefn return bool, and
  adapt host_cpu, kvm_cpu, hvf_cpu and tcg_cpu in i386 accordingly.
  Ultimately, consistently moving to a pattern of realize functions
  returning bool will require a rework of all devices.

v13 -> v14: rebased on latest master.
v12 -> v13: rebased on latest master.

v11 -> v12: reordered patches and improved tcg_ops

* reordered all TcgCpuOperations stuff so it is at the beginning

* added patches for ARM-specific tcg ops
  debug_check_watchpoint and adjust_watchpoint_address

* added a patch that puts a forward declared pointer in the struct,
  so as to reduce the change of misuse between common_ss and specific_ss code,
  and tidy up as a consequence all targets, by defining dedicated structs.

v10 -> v11: split off PART 2,

no further changes to PART 2 other than the split.

v9 -> v10: minor tweaks and fixes

* in "i386: split cpu accelerators from cpu.c",

use kvm/kvm-cpu.c, hvf/hvf-cpu.c, tcg/tcg-cpu.c.
Easier to understand compared to editing multiple cpu.c files,
and matches the header files if needed (kvm-cpu.h).

* in "accel: replace struct CpusAccel with AccelOpsClass",

make it a bit more consistent, by naming the files defining
the AccelOpsClass types "...-accel-ops.c" instead of the old
naming "...-cpus.c".

* in "cpu: move cc->transaction_failed to tcg_ops",

protect with CONFIG_TCG the use of tcg_ops for hw/misc/jazz.c,

 #include "exec/memattrs.h" (Philippe, Eduardo)

* in "cpu: Move synchronize_from_tb() to tcg_ops",

 #include "hw/core/cpu.h" (Philippe, Eduardo)

do not remove the comment about struct TcgCpuOperations (Philippe)

* in "accel/tcg: split TCG-only code from cpu_exec_realizefn",

invert tcg_target_initialized set order (Alex)

* in "i386: move TCG cpu class initialization out of helper.c",

extract helper-tcg.h, tcg-cpu.c, and tcg-cpu.h directly into
tcg/, avoiding the extra move later to tcg/ (Alex)



v8 -> v9: move additional methods to CPUClass->tcg_ops

do_unaligned_access, transaction_failed and do_interrupt.

do_interrupt is a bit tricky, as the same code is reused
(albeit not usually directly) for KVM under certain odd conditions.

Change arm, as the only user of do_interrupt callback for KVM,
to instead call the target function directly arm_do_interrupt.

v7 -> v8: add missing CONFIG_TCGs, fix bugs

* add the prerequisite patches for "3 tcg" at the beginning of the
  series for convenience (already reviewed, queued by RH).

* add CONFIG_TCG to TCGCpuOperations and tcg_ops variable use

* reduce the scope of the realizefn refactoring, do not
  introduce a separate cpu_accel_realize, and instead use the
  existing cpu_exec_realizefn, there is not enough benefit
  to introduce a new function.

* fix bugs in user mode due to attempt to move the tcg_region_init()
  early, so it could be done just once in tcg_init() for both
  softmmu and user mode. Unfortunately it needs to remain deferred
  for user mode, as it needs to be done after prologue init and
  after the GUEST_BASE has been set.

v6 -> v7: integrate TCGCpuOperations, refactored cpu_exec_realizefn

* integrate TCGCpuOperations (Eduardo)

Taken some refactoring from Eduardo for Tcg-only operations on
CPUClass.

* refactored cpu_exec_realizefn

The other main change is a refactoring of cpu_exec_realizefn,
directly linked to the effort of making many cpu_exec operations
TCG-only (Eduardo series above):

cpu_exec_realizefn is actually a TCG-only thing, with the
exception of a couple things that can be done in base cpu code.

This changes all targets realizefn, so I guess I have to Cc:
the Multiverse? (Universe was