From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:35891) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RloWY-0003wY-JZ for qemu-devel@nongnu.org; Fri, 13 Jan 2012 16:18:59 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RloWX-0000nz-8C for qemu-devel@nongnu.org; Fri, 13 Jan 2012 16:18:58 -0500 Received: from e33.co.us.ibm.com ([32.97.110.151]:33552) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RloWW-0000np-Rk for qemu-devel@nongnu.org; Fri, 13 Jan 2012 16:18:57 -0500 Received: from /spool/local by e33.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 13 Jan 2012 14:18:54 -0700 Received: from d03av01.boulder.ibm.com (d03av01.boulder.ibm.com [9.17.195.167]) by d03relay03.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q0DLITLP052428 for ; Fri, 13 Jan 2012 14:18:29 -0700 Received: from d03av01.boulder.ibm.com (loopback [127.0.0.1]) by d03av01.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q0DLISfS023689 for ; Fri, 13 Jan 2012 14:18:28 -0700 Message-ID: <4F109FA2.3090507@us.ibm.com> Date: Fri, 13 Jan 2012 15:18:26 -0600 From: Anthony Liguori MIME-Version: 1.0 References: <00e7573f6e10ab3e1f9a4a7946da9c19a40344cf.1326476111.git.jan.kiszka@siemens.com> In-Reply-To: <00e7573f6e10ab3e1f9a4a7946da9c19a40344cf.1326476111.git.jan.kiszka@siemens.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v6 06/18] apic: Factor out base class for KVM reuse List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Jan Kiszka Cc: kvm@vger.kernel.org, "Michael S. Tsirkin" , Marcelo Tosatti , qemu-devel , Blue Swirl , Avi Kivity On 01/13/2012 11:35 AM, Jan Kiszka wrote: > The KVM in-kernel APIC model will reuse parts of the user space model > while providing the same frontend view to guest and most management > interfaces. > > Factor out an APIC base class to encapsulate those parts that will be > shared by user space and KVM model. This class offers callback hooks for > init, base/tpr setting, and the external NMI delivery that will be > set via APICCommonInfo super-structure and implemented specifically in > the subclasses. > > Furthermore, a common vmstate and a common list of qdev properties is > provided with the base clase. Also the reset handler will be shared. > > diff --git a/hw/apic_internal.h b/hw/apic_internal.h > new file mode 100644 > index 0000000..2ca18d4 > --- /dev/null > +++ b/hw/apic_internal.h > @@ -0,0 +1,121 @@ > +/* > + * APIC support - internal interfaces > + * > + * Copyright (c) 2004-2005 Fabrice Bellard > + * Copyright (c) 2011 Jan Kiszka, Siemens AG > + * > + * This library is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public > + * License as published by the Free Software Foundation; either > + * version 2 of the License, or (at your option) any later version. > + * > + * This library is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with this library; if not, see > + */ > +#ifndef QEMU_APIC_INTERNAL_H > +#define QEMU_APIC_INTERNAL_H > + > +#include "memory.h" > +#include "sysbus.h" > +#include "qemu-timer.h" > + > +/* APIC Local Vector Table */ > +#define APIC_LVT_TIMER 0 > +#define APIC_LVT_THERMAL 1 > +#define APIC_LVT_PERFORM 2 > +#define APIC_LVT_LINT0 3 > +#define APIC_LVT_LINT1 4 > +#define APIC_LVT_ERROR 5 > +#define APIC_LVT_NB 6 > + > +/* APIC delivery modes */ > +#define APIC_DM_FIXED 0 > +#define APIC_DM_LOWPRI 1 > +#define APIC_DM_SMI 2 > +#define APIC_DM_NMI 4 > +#define APIC_DM_INIT 5 > +#define APIC_DM_SIPI 6 > +#define APIC_DM_EXTINT 7 > + > +/* APIC destination mode */ > +#define APIC_DESTMODE_FLAT 0xf > +#define APIC_DESTMODE_CLUSTER 1 > + > +#define APIC_TRIGGER_EDGE 0 > +#define APIC_TRIGGER_LEVEL 1 > + > +#define APIC_LVT_TIMER_PERIODIC (1<<17) > +#define APIC_LVT_MASKED (1<<16) > +#define APIC_LVT_LEVEL_TRIGGER (1<<15) > +#define APIC_LVT_REMOTE_IRR (1<<14) > +#define APIC_INPUT_POLARITY (1<<13) > +#define APIC_SEND_PENDING (1<<12) > + > +#define ESR_ILLEGAL_ADDRESS (1<< 7) > + > +#define APIC_SV_DIRECTED_IO (1<<12) > +#define APIC_SV_ENABLE (1<<8) > + > +#define MAX_APICS 255 > + > +#define MSI_SPACE_SIZE 0x100000 > + > +typedef struct APICCommonState APICCommonState; > + > +struct APICCommonState { > + SysBusDevice busdev; > + MemoryRegion io_memory; > + void *cpu_env; > + uint32_t apicbase; > + uint8_t id; > + uint8_t arb_id; > + uint8_t tpr; > + uint32_t spurious_vec; > + uint8_t log_dest; > + uint8_t dest_mode; > + uint32_t isr[8]; /* in service register */ > + uint32_t tmr[8]; /* trigger mode register */ > + uint32_t irr[8]; /* interrupt request register */ > + uint32_t lvt[APIC_LVT_NB]; > + uint32_t esr; /* error register */ > + uint32_t icr[2]; > + > + uint32_t divide_conf; > + int count_shift; > + uint32_t initial_count; > + int64_t initial_count_load_time; > + int64_t next_time; > + int idx; > + QEMUTimer *timer; > + int sipi_vector; > + int wait_for_sipi; > +}; > + > +typedef struct APICCommonInfo APICCommonInfo; > + > +struct APICCommonInfo { > + SysBusDeviceInfo busdev; > + void (*init)(APICCommonState *s); > + void (*set_base)(APICCommonState *s, uint64_t val); > + void (*set_tpr)(APICCommonState *s, uint8_t val); > + void (*external_nmi)(APICCommonState *s); > +}; > + > +#define APIC_VMSTATE_VERSION 3 > + > +extern const VMStateDescription vmstate_apic_common; > + > +#define APIC_PROPERTIES_COMMON(cont_type, cont_var) \ > + DEFINE_PROP_UINT8("id", cont_type, cont_var.id, -1), \ > + DEFINE_PROP_PTR("cpu_env", cont_type, cont_var.cpu_env) > + > +void apic_report_irq_delivered(int delivered); > +void apic_reset_common(DeviceState *d); > +int apic_init_common(SysBusDevice *d); I think you want to introduce an apic_qdev_register(APICCommonInfo *). Then you can set info->qdev.vmsd = &vmstate_apic_common and avoid having to make it extern. Regards, Anthony Liguori > + > +#endif /* !QEMU_APIC_INTERNAL_H */