1. 17 12月, 2015 40 次提交
    • S
      ARM: Virt: Add a GPIO controller · b0a3721e
      Shannon Zhao 提交于
      ACPI 5.0 supports GPIO-signaled ACPI Events. This can be used for
      powerdown, hotplug evnets. Add a GPIO controller in machine virt,
      to support powerdown, maybe can be used for cpu hotplug. And
      here we use pl061.
      Signed-off-by: NShannon Zhao <zhaoshenglong@huawei.com>
      Signed-off-by: NShannon Zhao <shannon.zhao@linaro.org>
      Reviewed-by: NWei Huang <wei@redhat.com>
      Tested-by: NWei Huang <wei@redhat.com>
      Message-id: 1449804086-3464-4-git-send-email-zhaoshenglong@huawei.com
      Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
      b0a3721e
    • I
      acpi: extend aml_interrupt() to support multiple irqs · 45fcf539
      Igor Mammedov 提交于
      ASL Interrupt() macro translates to Extended Interrupt Descriptor
      which supports variable number of IRQs. It will be used for
      conversion of ASL code for pc/q35 machines that use it for
      returning several IRQs in _PSR object.
      Signed-off-by: NIgor Mammedov <imammedo@redhat.com>
      Reviewed-by: NShannon Zhao <shannon.zhao@linaro.org>
      Signed-off-by: NShannon Zhao <shannon.zhao@linaro.org>
      Message-id: 1449804086-3464-3-git-send-email-zhaoshenglong@huawei.com
      Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
      45fcf539
    • X
      acpi: support serialized method · 4dbfc881
      Xiao Guangrong 提交于
      Add serialized method support so that explicit Mutex can be
      avoided
      Signed-off-by: NXiao Guangrong <guangrong.xiao@linux.intel.com>
      Signed-off-by: NIgor Mammedov <imammedo@redhat.com>
      Reviewed-by: NShannon Zhao <shannon.zhao@linaro.org>
      Signed-off-by: NShannon Zhao <shannon.zhao@linaro.org>
      Message-id: 1449804086-3464-2-git-send-email-zhaoshenglong@huawei.com
      Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
      4dbfc881
    • S
      target-arm: Fix and improve AA32 singlestep translation completion code · 7999a5c8
      Sergey Fedorov 提交于
      The AArch32 translation completion code for singlestep enabled/active
      case was a way more confusing and too repetitive then it needs to be.
      Probably that was the cause for a bug to be introduced into it at some
      point. The bug was that SWI/HVC/SMC exception would be generated in
      condition-failed instruction code path whereas it shouldn't.
      
      This patch rewrites the code in a way similar to the non-singlestep
      case.
      
      In the condition-passed/unconditional instruction code path we need to:
       - Write the condexec bits back to the CPU state
       - Advance the singlestep state machine and generate a corresponding
         exception in case of SWI/HVC/SMC
       - Write the PC back to the CPU state if it hasn't already been written
         and generate an appropriate singlestep exception otherwise
      
      In the condition-failed instruction code path we need to:
       - Set a TCG label to jump to it if the condition is failed
       - Write the condexec bits back to the CPU state
       - Write the PC back to the CPU state since it hasn't been written in
         this case
       - Generate an appropriate singlestep exception
      Signed-off-by: NSergey Fedorov <serge.fdrv@gmail.com>
      Message-id: 1448474560-22475-1-git-send-email-serge.fdrv@gmail.com
      Reviewed-by: NPeter Maydell <peter.maydell@linaro.org>
      Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
      7999a5c8
    • A
      target-arm: raise exception on misaligned LDREX operands · 30901475
      Andrew Baumann 提交于
      Qemu does not generally perform alignment checks. However, the ARM ARM
      requires implementation of alignment exceptions for a number of cases
      including LDREX, and Windows-on-ARM relies on this.
      
      This change adds plumbing to enable alignment checks on loads using
      MO_ALIGN, a do_unaligned_access hook to raise the exception (data
      abort), and uses the new aligned loads in LDREX (for all but
      single-byte loads).
      Signed-off-by: NAndrew Baumann <Andrew.Baumann@microsoft.com>
      Message-id: 1449167808-5656-1-git-send-email-Andrew.Baumann@microsoft.com
      [PMM: set WnR bits in syndrome and FSR as appropriate]
      Reviewed-by: NPeter Maydell <peter.maydell@linaro.org>
      Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
      30901475
    • P
      arm: soc-dma: use hwaddr instead of target_ulong in printf · 580106df
      Paolo Bonzini 提交于
      This is a first baby step towards removing widespread inclusion of
      cpu.h and compiling more devices once (so that arm, aarch64 and
      in the future target-multi can share the object files).
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      Reviewed-by: NPeter Maydell <peter.maydell@linaro.org>
      [PMM: changed __FUNCTION__ to __func__ since we're touching
       these lines of code anyway]
      Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
      580106df
    • P
      arm: explicitly mark device loads as little-endian · 58f6d82f
      Paolo Bonzini 提交于
      Behaviour of emulated devices should not depend on the endianness
      of the CPU, so avoid using the endian-dependent load and store
      functions in the PXA2xx and OMAP display devices. These devices
      are little endian when they do DMA access.
      
      (Since ARM softmmu is always compiled as little endian, this means
      that the endian-dependent load and store functions are always little
      endian, so this commit makes no functionally visible change.)
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      Reviewed-by: NPeter Maydell <peter.maydell@linaro.org>
      [PMM: rewrote commit message]
      Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
      58f6d82f
    • J
      i.MX: add support for lower and upper interrupt in GPIO. · f1f7e4bf
      Jean-Christophe Dubois 提交于
      The i.MX6 GPIO device supports 2 interrupts instead of one.
      
      * 1 for the lower 16 GPIOs.
      * 1 for the upper 16 GPIOs.
      
      i.MX31 and i.MX25 only support 1 interrupt for the 32 GPIOs.
      
      So we add a property to turn the behavior on when required.
      Signed-off-by: NJean-Christophe Dubois <jcd@tribudubois.net>
      Reviewed-by: NPeter Crosthwaite <crosthwaite.peter@gmail.com>
      Message-id: 1447497668-1603-1-git-send-email-jcd@tribudubois.net
      Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
      f1f7e4bf
    • P
      Merge remote-tracking branch 'remotes/kraxel/tags/pull-fw-cfg-20151217-1' into staging · 98557acf
      Peter Maydell 提交于
      fw_cfg: doc updates, various optimizations.
      
      # gpg: Signature made Thu 17 Dec 2015 08:59:32 GMT using RSA key ID D3E87138
      # gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>"
      # gpg:                 aka "Gerd Hoffmann <gerd@kraxel.org>"
      # gpg:                 aka "Gerd Hoffmann (private) <kraxel@gmail.com>"
      
      * remotes/kraxel/tags/pull-fw-cfg-20151217-1:
        fw_cfg: replace ioport data read with generic method
        fw_cfg: add generic non-DMA read method
        fw_cfg: avoid calculating invalid current entry pointer
        fw_cfg: remove offset argument from callback prototype
        fw_cfg: amend callback behavior spec to once per select
        fw_cfg: move internal function call docs to header file
      Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
      98557acf
    • P
      Merge remote-tracking branch 'remotes/armbru/tags/pull-qapi-2015-12-17' into staging · c1a5f950
      Peter Maydell 提交于
      QAPI patches for 2015-12-17
      
      # gpg: Signature made Thu 17 Dec 2015 07:33:41 GMT using RSA key ID EB918653
      # gpg: Good signature from "Markus Armbruster <armbru@redhat.com>"
      # gpg:                 aka "Markus Armbruster <armbru@pond.sub.org>"
      
      * remotes/armbru/tags/pull-qapi-2015-12-17: (40 commits)
        qapi: Detect base class loops
        qapi: Move duplicate collision checks to schema check()
        qapi: Enforce (or whitelist) case conventions on qapi members
        qapi: Track enum values by QAPISchemaMember, not string
        qapi: Prepare new QAPISchemaMember base class
        qapi: Shorter visits of optional fields
        qapi: Simplify visits of optional fields
        qapi: Fix alternates that accept 'number' but not 'int'
        qapi: Inline _make_implicit_tag()
        qapi-types: Drop unnedeed ._fwdefn
        qapi: Simplify visiting of alternate types
        qapi: Convert QType into QAPI built-in enum type
        qobject: Rename qtype_code to QType
        qobject: Simplify QObject
        qapi: Change munging of CamelCase enum values
        qapi: Add alias for ErrorClass
        cpu: Convert CpuInfo into flat union
        qapi: Remove obsolete tests for MAX collision
        qapi: Don't let implicit enum MAX member collide
        qapi: Tighten the regex on valid names
        ...
      Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
      c1a5f950
    • P
      Merge remote-tracking branch 'remotes/kraxel/tags/pull-audio-20151215-1' into staging · fc77eb20
      Peter Maydell 提交于
      coreaudio: use new-in-OSX-10.6 APIs, cleanups.
      
      # gpg: Signature made Tue 15 Dec 2015 10:15:24 GMT using RSA key ID D3E87138
      # gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>"
      # gpg:                 aka "Gerd Hoffmann <gerd@kraxel.org>"
      # gpg:                 aka "Gerd Hoffmann (private) <kraxel@gmail.com>"
      
      * remotes/kraxel/tags/pull-audio-20151215-1:
        audio/coreaudio.c: Avoid deprecated AudioDeviceAdd/RemoveIOProc APIs
        audio/coreaudio.c: Use new-in-OSX-10.6 APIs when available
        audio/coreaudio.c: Factor out uses of AudioDeviceGet/SetProperty
        audio/coreaudio.c: Use new-in-OSX-10.6 API for getting default voice
        audio/coreaudio.c: Factor out use of AudioHardwareGetProperty
      Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
      fc77eb20
    • P
      Merge remote-tracking branch 'remotes/kraxel/tags/pull-usb-20151215-1' into staging · dc337c6e
      Peter Maydell 提交于
      usb: ehci idt fix, event support for mtp
      
      # gpg: Signature made Tue 15 Dec 2015 09:54:22 GMT using RSA key ID D3E87138
      # gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>"
      # gpg:                 aka "Gerd Hoffmann <gerd@kraxel.org>"
      # gpg:                 aka "Gerd Hoffmann (private) <kraxel@gmail.com>"
      
      * remotes/kraxel/tags/pull-usb-20151215-1:
        ehci: make idt processing more robust
        usb-mtp: add support for basic mtp events
        usb-mtp: Add support for inotify based file monitoring
        usb-mtp: free objects on a mtp reset
        usb-mtp: use a list for keeping track of children
      Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
      dc337c6e
    • P
      Open 2.6 development tree · 71f3ef08
      Peter Maydell 提交于
      Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
      71f3ef08
    • E
      qapi: Detect base class loops · bac5429c
      Eric Blake 提交于
      It should be fairly obvious that qapi base classes need to
      form an acyclic graph, since QMP cannot specify the same
      key more than once, while base classes are included as flat
      members alongside other members added by the child.  But the
      old check_member_clash() parser function was not prepared to
      check for this, and entered an infinite recursion (at least
      until Python gives up, complaining about nesting too deep).
      
      Now that check_member_clash() has been recently removed,
      attempts at self-inheritance trigger an assertion failure
      introduced by commit ac88219a.  The obvious fix is to turn
      the assertion into a conditional.
      
      This patch includes both the tests (base-cycle-direct and
      base-cycle-indirect) and the fix, since the .err file output
      for the unfixed case is not useful (particularly when it was
      warning about unbounded recursion, as that limit may be
      platform-specific).
      
      We don't need to worry about cycles in flat unions (neither
      the base type nor the type of a variant can be a union) nor
      in alternates (alternate branches cannot themselves be an
      alternate).  But if we later allow a union type as a variant,
      we will still be okay, as QAPISchemaObjectTypeVariants.check()
      triggers the same QAPISchemaObjectType.check() that will
      detect any loops.
      
      Likewise, we need not worry about the case of diamond
      inheritance where the same class is used for a flat union base
      class and one of its variants; either both uses will introduce
      a collision in trying to insert the same member name twice, or
      the shared type is empty and changes nothing.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1449033659-25497-16-git-send-email-eblake@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      bac5429c
    • E
      qapi: Move duplicate collision checks to schema check() · 01cfbaa4
      Eric Blake 提交于
      With the recent commit 'qapi: Detect collisions in C member
      names', we have two different locations for detecting clashes -
      one at parse time, and another at QAPISchema*.check() time.
      Remove all of the ad hoc parser checks, and delete associated
      code (for example, the global check_member_clash() method is
      no longer needed).
      
      Testing this showed that the test union-bad-branch wasn't adding
      much: union-clash-branches also exposes the error message when
      branches collide, and we've recently fixed things to avoid an
      implicit collision with max.  Likewise, the error for
      enum-clash-member changes to report our new detection of
      upper case in a value name, unless we modify the test to use
      all lower case.
      
      The wording of several error messages has changed, but the
      change is generally an improvement rather than a regression.
      
      No change to generated code.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1449033659-25497-15-git-send-email-eblake@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      01cfbaa4
    • E
      qapi: Enforce (or whitelist) case conventions on qapi members · 893e1f2c
      Eric Blake 提交于
      We document that members of enums and objects should be
      'lower-case', although we were not enforcing it.  We have to
      whitelist a few pre-existing entities that violate the norms.
      Add three new tests to expose the new error message, each of
      which first uses the whitelisted name 'UuidInfo' to prove the
      whitelist works, then triggers the failure (this is the same
      pattern used in the existing returns-whitelist.json test).
      
      Note that by adding this check, we have effectively forbidden
      an entity with a case-insensitive clash of member names, for
      any entity that is not on the whitelist (although there is
      still the possibility to clash via '-' vs. '_').
      
      Not done here: a future patch should also add naming convention
      support and whitelist exceptions for command, event, and type
      names.
      
      The additions to QAPISchemaMember.check_clash() check whether
      info['name'] is in the whitelist (the top-most entity name at
      the point 'info' tracks), rather than self.owner (the type,
      possibly implicit, that directly owns the member), because it
      is easier to maintain the whitelist by the names actually in
      the user's .json file, rather than worrying about the names
      of implicit types.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1449033659-25497-14-git-send-email-eblake@redhat.com>
      [Simplified a bit as per discussion with Eric]
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      893e1f2c
    • E
      qapi: Track enum values by QAPISchemaMember, not string · 93bda4dd
      Eric Blake 提交于
      Rather than using just an array of strings, make enum.values be
      an array of the new QAPISchemaMember type, and add a helper
      member_names() method to get back at the original list of names.
      Likewise, creating an enum requires wrapping strings, via a new
      QAPISchema._make_enum_members() method.  The benefit of wrapping
      enum members in a QAPISchemaMember Python object is that we now
      share the existing code for C name clash detection (although the
      code is not yet active until a later commit removes the earlier
      ad hoc parser checks).
      
      In a related change, the QAPISchemaMember._pretty_owner() method
      needs to learn about one more implicit type name: the generated
      enum associated with a simple union.
      
      In the interest of keeping the changes of this patch local to one
      file, the visitor interface still passes just a list of names
      rather than the full list of QAPISchemaMember instances.  We may
      want to revisit this in the future, if the consistency with
      visit_object_type() is worth it.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1449033659-25497-12-git-send-email-eblake@redhat.com>
      [Eric's simplifying followup squashed in]
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      93bda4dd
    • E
      qapi: Prepare new QAPISchemaMember base class · d44f9ac8
      Eric Blake 提交于
      We want to share some clash detection code between enum values
      and object type members.  To assist with that, split off part
      of QAPISchemaObjectTypeMember into a new base class
      QAPISchemaMember that tracks name, owner, and common clash
      detection code; while the former keeps the additional fields
      for type and optional flag.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1449033659-25497-11-git-send-email-eblake@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      d44f9ac8
    • E
      qapi: Shorter visits of optional fields · 29637a6e
      Eric Blake 提交于
      For less code, reflect the determined boolean value of an optional
      visit back to the caller instead of making the caller read the
      boolean after the fact.
      
      The resulting generated code has the following diff:
      
      |-    visit_optional(v, &has_fdset_id, "fdset-id");
      |-    if (has_fdset_id) {
      |+    if (visit_optional(v, &has_fdset_id, "fdset-id")) {
      |         visit_type_int(v, &fdset_id, "fdset-id", &err);
      |         if (err) {
      |             goto out;
      |         }
      |     }
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1449033659-25497-10-git-send-email-eblake@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      29637a6e
    • E
      qapi: Simplify visits of optional fields · 5cdc8831
      Eric Blake 提交于
      None of the visitor callbacks would set an error when testing
      if an optional field was present; make this part of the interface
      contract by eliminating the errp argument.
      
      The resulting generated code has a nice diff:
      
      |-    visit_optional(v, &has_fdset_id, "fdset-id", &err);
      |-    if (err) {
      |-        goto out;
      |-    }
      |+    visit_optional(v, &has_fdset_id, "fdset-id");
      |     if (has_fdset_id) {
      |         visit_type_int(v, &fdset_id, "fdset-id", &err);
      |         if (err) {
      |             goto out;
      |         }
      |     }
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1449033659-25497-9-git-send-email-eblake@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      5cdc8831
    • E
      qapi: Fix alternates that accept 'number' but not 'int' · d00341af
      Eric Blake 提交于
      The QMP input visitor allows integral values to be assigned by
      promotion to a QTYPE_QFLOAT.  However, when parsing an alternate,
      we did not take this into account, such that an alternate that
      accepts 'number' and some other type, but not 'int', would reject
      integral values.
      
      With this patch, we now have the following desirable table:
      
          alternate has      case selected for
          'int'  'number'    QTYPE_QINT  QTYPE_QFLOAT
            no        no     error       error
            no       yes     'number'    'number'
           yes        no     'int'       error
           yes       yes     'int'       'number'
      
      While it is unlikely that we will ever use 'number' in an
      alternate other than in the testsuite, it never hurts to be
      more precise in what we allow.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1449033659-25497-8-git-send-email-eblake@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      d00341af
    • E
      qapi: Inline _make_implicit_tag() · 9d3f3494
      Eric Blake 提交于
      Now that alternates no longer use an implicit tag, we can
      inline _make_implicit_tag() into its one caller,
      _def_union_type().
      
      No change to generated code.
      Suggested-by: NMarkus Armbruster <armbru@redhat.com>
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1449033659-25497-7-git-send-email-eblake@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      9d3f3494
    • E
      qapi-types: Drop unnedeed ._fwdefn · 0b2e84ba
      Eric Blake 提交于
      Previously, the generated code in qapi-types.c initialized all
      enum lookup tables first, prior to any other definitions.  But
      there are no topological sorting requirements that mandate this
      layout, so we can drop the QAPISchemaGenTypeVisitor._fwdefn
      field and just generate all definitions in visitation order.
      
      The generated code shows some churn due to reordering, but it
      is still fairly straightforward to follow (all the deletions
      occur in one hunk, and all the deleted lines are re-inserted
      in the same order later in the same files, just spread across
      multiple insertion points).
      Suggested-by: NMarkus Armbruster <armbru@redhat.com>
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1449033659-25497-6-git-send-email-eblake@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      0b2e84ba
    • E
      qapi: Simplify visiting of alternate types · 0426d53c
      Eric Blake 提交于
      Previously, working with alternates required two lookup arrays
      and some indirection: for type Foo, we created Foo_qtypes[]
      which maps each qtype to a value of the generated FooKind enum,
      then look up that value in FooKind_lookup[] like we do for other
      union types.
      
      This has a couple of subtle bugs.  First, the generator was
      creating a call with a parameter '(int *) &(*obj)->type' where
      type is an enum type; this is unsafe if the compiler chooses
      to store the enum type in a different size than int, where
      assigning through the wrong size pointer can corrupt data or
      cause a SIGBUS.
      
      Related bug, not not fixed in this patch: qapi-visit.py's
      gen_visit_enum() generates a cast of its enum * argument to
      int *. Marked FIXME.
      
      Second, since the values of the FooKind enum start at zero, all
      entries of the Foo_qtypes[] array that were not explicitly
      initialized will map to the same branch of the union as the
      first member of the alternate, rather than triggering a desired
      failure in visit_get_next_type().  Fortunately, the bug seldom
      bites; the very next thing the input visitor does is try to
      parse the incoming JSON with the wrong parser, which normally
      fails; the output visitor is not used with a C struct in that
      state, and the dealloc visitor has nothing to clean up (so
      there is no leak).
      
      However, the second bug IS observable in one case: parsing an
      integer causes unusual behavior in an alternate that contains
      at least a 'number' member but no 'int' member, because the
      'number' parser accepts QTYPE_QINT in addition to the expected
      QTYPE_QFLOAT (that is, since 'int' is not a member, the type
      QTYPE_QINT accidentally maps to FooKind 0; if this enum value
      is the 'number' branch the integer parses successfully, but if
      the 'number' branch is not first, some other branch tries to
      parse the integer and rejects it).  A later patch will worry
      about fixing alternates to always parse all inputs that a
      non-alternate 'number' would accept, for now this is still
      marked FIXME in the updated test-qmp-input-visitor.c, to
      merely point out that new undesired behavior of 'ans' matches
      the existing undesired behavior of 'asn'.
      
      This patch fixes the default-initialization bug by deleting the
      indirection, and modifying get_next_type() to directly assign a
      QTypeCode parameter.  This in turn fixes the type-casting bug,
      as we are no longer casting a pointer to enum to a questionable
      size. There is no longer a need to generate an implicit FooKind
      enum associated with the alternate type (since the QMP wire
      format never uses the stringized counterparts of the C union
      member names).  Since the updated visit_get_next_type() does not
      know which qtypes are expected, the generated visitor is
      modified to generate an error statement if an unexpected type is
      encountered.
      
      Callers now have to know the QTYPE_* mapping when looking at the
      discriminator; but so far, only the testsuite was even using the
      C struct of an alternate types.  I considered the possibility of
      keeping the internal enum FooKind, but initialized differently
      than most generated arrays, as in:
        typedef enum FooKind {
            FOO_KIND_A = QTYPE_QDICT,
            FOO_KIND_B = QTYPE_QINT,
        } FooKind;
      to create nicer aliases for knowing when to use foo->a or foo->b
      when inspecting foo->type; but it turned out to add too much
      complexity, especially without a client.
      
      There is a user-visible side effect to this change, but I
      consider it to be an improvement. Previously,
      the invalid QMP command:
        {"execute":"blockdev-add", "arguments":{"options":
          {"driver":"raw", "id":"a", "file":true}}}
      failed with:
        {"error": {"class": "GenericError",
          "desc": "Invalid parameter type for 'file', expected: QDict"}}
      (visit_get_next_type() succeeded, and the error comes from the
      visit_type_BlockdevOptions() expecting {}; there is no mention of
      the fact that a string would also work).  Now it fails with:
        {"error": {"class": "GenericError",
          "desc": "Invalid parameter type for 'file', expected: BlockdevRef"}}
      (the error when the next type doesn't match any expected types for
      the overall alternate).
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1449033659-25497-5-git-send-email-eblake@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      0426d53c
    • E
      qapi: Convert QType into QAPI built-in enum type · 7264f5c5
      Eric Blake 提交于
      What's more meta than using qapi to define qapi? :)
      
      Convert QType into a full-fledged[*] builtin qapi enum type, so
      that a subsequent patch can then use it as the discriminator
      type of qapi alternate types.  Fortunately, the judicious use of
      'prefix' in the qapi definition avoids churn to the spelling of
      the enum constants.
      
      To avoid circular definitions, we have to flip the order of
      inclusion between "qobject.h" vs. "qapi-types.h".  Back in commit
      28770e05, we had the latter include the former, so that we could
      use 'QObject *' for our implementation of 'any'.  But that usage
      also works with only a forward declaration, whereas the
      definition of QObject requires QType to be a complete type.
      
      [*] The type has to be builtin, rather than declared in
      qapi/common.json, because we want to use it for alternates even
      when common.json is not included. But since it is the first
      builtin enum type, we have to add special cases to qapi-types
      and qapi-visit to only emit definitions once, even when two
      qapi files are being compiled into the same binary (the way we
      already handled builtin list types like 'intList').  We may
      need to revisit how multiple qapi files share common types,
      but that's a project for another day.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1449033659-25497-4-git-send-email-eblake@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      7264f5c5
    • E
      qobject: Rename qtype_code to QType · 1310a3d3
      Eric Blake 提交于
      The name QType matches our CODING_STYLE conventions for type names
      in CamelCase.  It also matches the fact that we are already naming
      all the enum members with a prefix of QTYPE, not QTYPE_CODE.  And
      doing the rename will also make it easier for the next patch to use
      QAPI for providing the enum, which also wants CamelCase type names.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1449033659-25497-3-git-send-email-eblake@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      1310a3d3
    • E
      qobject: Simplify QObject · 55e1819c
      Eric Blake 提交于
      The QObject hierarchy is small enough, and unlikely to grow further
      (since we only use it to map to JSON and already cover all JSON
      types), that we can simplify things by not tracking a separate
      vtable, but just inline the code element of the vtable QType
      directly into QObject (renamed to type), and track a separate array
      of destroy functions.  We can drop qnull_destroy_obj() in the
      process.
      
      The remaining QObject subclasses must export their destructor.
      
      This also has the nice benefit of moving the typename 'QType'
      out of the way, so that the next patch can repurpose it for a
      nicer name for 'qtype_code'.
      
      The various objects are still the same size (so no change in cache
      line pressure), but now have less indirection (although I didn't
      bother benchmarking to see if there is a noticeable speedup, as
      we don't have hard evidence that this was in a performance hotspot
      in the first place).
      
      A future patch could drop the refcnt size to 32 bits for a smaller
      struct on 64-bit architectures, if desired (we have limits on the
      largest JSON that we are willing to parse, and will probably never
      need to take full advantage of a 64-bit refcnt).
      Suggested-by: NMarkus Armbruster <armbru@redhat.com>
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1449033659-25497-2-git-send-email-eblake@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      55e1819c
    • E
      qapi: Change munging of CamelCase enum values · d20a580b
      Eric Blake 提交于
      When munging enum values, the fact that we were passing the entire
      prefix + value through camel_to_upper() meant that enum values
      spelled with CamelCase could be turned into CAMEL_CASE.  However,
      this provides a potential collision (both OneTwo and One-Two would
      munge into ONE_TWO) for enum types, when the same two names are
      valid side-by-side as QAPI member names.  By changing the generation
      of enum constants to always be prefix + '_' + c_name(value,
      False).upper(), and ensuring that there are no case collisions (in
      the next patches), we no longer have to worry about names that
      would be distinct as QAPI members but collide as variant tag names,
      without having to think about what munging the heuristics in
      camel_to_upper() will actually perform on an enum value.
      
      Making the change will affect enums that did not follow coding
      conventions, using 'CamelCase' rather than desired 'lower-case'.
      
      Thankfully, there are only two culprits: InputButton and ErrorClass.
      We already tweaked ErrorClass to make it an alias of QapiErrorClass,
      where only the alias needs changing rather than the whole tree.  So
      the bulk of this change is modifying INPUT_BUTTON_WHEEL_UP to the
      new INPUT_BUTTON_WHEELUP (and likewise for WHEELDOWN).  That part
      of this commit may later need reverting if we rename the enum
      constants from 'WheelUp' to 'wheel-up' as part of moving
      x-input-send-event to a stable interface; but at least we have
      documentation bread crumbs in place to remind us (commit 513e7cdb),
      and it matches the fact that SDL constants are also spelled
      SDL_BUTTON_WHEELUP.
      
      Suggested by: Markus Armbruster <armbru@redhat.com>
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1447836791-369-27-git-send-email-eblake@redhat.com>
      [Commit message tweaked]
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      d20a580b
    • E
      qapi: Add alias for ErrorClass · f22a28b8
      Eric Blake 提交于
      The qapi enum ErrorClass is unusual that it uses 'CamelCase' names,
      contrary to our documented convention of preferring 'lower-case'.
      However, this enum is entrenched in the API; we cannot change
      what strings QMP outputs.  Meanwhile, we want to simplify how
      c_enum_const() is used to generate enum constants, by moving away
      from the heuristics of camel_to_upper() to a more straightforward
      c_name(N).upper() - but doing so will rename all of the ErrorClass
      constants and cause churn to all client files, where the new names
      are aesthetically less pleasing (ERROR_CLASS_DEVICENOTFOUND looks
      like we can't make up our minds on whether to break between words).
      
      So as always in computer science, solve the problem by some more
      indirection: rename the qapi type to QapiErrorClass, and add a
      new enum ErrorClass in error.h whose members are aliases of the
      qapi type, but with the spelling expected elsewhere in the tree.
      Then, when c_enum_const() changes the munging, we only have to
      adjust the one alias spot.
      
      Suggested by: Markus Armbruster <armbru@redhat.com>
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1447836791-369-26-git-send-email-eblake@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      f22a28b8
    • E
      cpu: Convert CpuInfo into flat union · 86f4b687
      Eric Blake 提交于
      The CpuInfo struct is used only by the 'query-cpus' output
      command, so we are free to modify it by adding fields (clients
      are already supposed to ignore unknown output fields), or by
      changing optional members to mandatory, while still keeping
      QMP wire compatibility with older versions of qemu.
      
      When qapi type CpuInfo was originally created for 0.14, we had
      no notion of a flat union, and instead just listed a bunch of
      optional fields with documentation about the mutually-exclusive
      choice of which instruction pointer field(s) would be provided
      for a given architecture.  But now that we have flat unions and
      introspection, it is better to segregate off which fields will
      be provided according to the actual architecture.  With this in
      place, we no longer need the fields to be optional, because the
      choice of the new 'arch' discriminator serves that role.
      
      This has an additional benefit: the old all-in-one struct was
      the only place in the code base that had a case-sensitive
      naming of members 'pc' vs. 'PC'.  Separating these spellings
      into different branches of the flat union will allow us to add
      restrictions against future case-insensitive collisions, since
      that is generally a poor interface practice.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1447836791-369-25-git-send-email-eblake@redhat.com>
      [Spelling of CPUInfo{SPARC,PPC,MIPS} fixed]
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      86f4b687
    • E
      qapi: Remove obsolete tests for MAX collision · 04e0639d
      Eric Blake 提交于
      Now that we no longer collide with an implicit _MAX enum member,
      we no longer need to reject it in the ad hoc parser, and can
      remove several tests that are no longer needed.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1447836791-369-24-git-send-email-eblake@redhat.com>
      [Commit message tweaked]
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      04e0639d
    • E
      qapi: Don't let implicit enum MAX member collide · 7fb1cf16
      Eric Blake 提交于
      Now that we guarantee the user doesn't have any enum values
      beginning with a single underscore, we can use that for our
      own purposes.  Renaming ENUM_MAX to ENUM__MAX makes it obvious
      that the sentinel is generated.
      
      This patch was mostly generated by applying a temporary patch:
      
      |diff --git a/scripts/qapi.py b/scripts/qapi.py
      |index e6d014b..b862ec9 100644
      |--- a/scripts/qapi.py
      |+++ b/scripts/qapi.py
      |@@ -1570,6 +1570,7 @@ const char *const %(c_name)s_lookup[] = {
      |     max_index = c_enum_const(name, 'MAX', prefix)
      |     ret += mcgen('''
      |     [%(max_index)s] = NULL,
      |+// %(max_index)s
      | };
      | ''',
      |                max_index=max_index)
      
      then running:
      
      $ cat qapi-{types,event}.c tests/test-qapi-types.c |
          sed -n 's,^// \(.*\)MAX,s|\1MAX|\1_MAX|g,p' > list
      $ git grep -l _MAX | xargs sed -i -f list
      
      The only things not generated are the changes in scripts/qapi.py.
      
      Rejecting enum members named 'MAX' is now useless, and will be dropped
      in the next patch.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1447836791-369-23-git-send-email-eblake@redhat.com>
      Reviewed-by: NJuan Quintela <quintela@redhat.com>
      [Rebased to current master, commit message tweaked]
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      7fb1cf16
    • E
      qapi: Tighten the regex on valid names · 59a92fee
      Eric Blake 提交于
      We already documented that qapi names should match specific
      patterns (such as starting with a letter unless it was an enum
      value or a downstream extension).  Tighten that from a suggestion
      into a hard requirement, which frees up names beginning with a
      single underscore for qapi internal usage.
      
      The tighter regex doesn't forbid everything insane that a user
      could provide (for example, a user could name a type 'Foo-lookup'
      to collide with the generated 'Foo_lookup[]' for an enum 'Foo'),
      but does a good job at protecting the most obvious uses, and
      also happens to reserve single leading underscore for later use.
      
      The handling of enum values starting with a digit is tricky:
      commit 9fb081e0 introduced a subtle bug by using c_name() on
      a munged value, which would allow an enum to include the
      member 'q-int' in spite of our reservation.  Furthermore,
      munging with a leading '_' would fail our tighter regex.  So
      fix it by only munging for leading digits (which are never
      ticklish in c_name()) and by using a different prefix (I
      picked 'D', although any letter should do).
      
      Add new tests, reserved-member-underscore and reserved-enum-q,
      to demonstrate the tighter checking.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1447836791-369-22-git-send-email-eblake@redhat.com>
      Message-Id: <1447883135-18020-1-git-send-email-eblake@redhat.com>
      [Eric's fixup squashed in]
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      59a92fee
    • E
      blkdebug: Avoid '.' in enum values · 5be5b776
      Eric Blake 提交于
      Our qapi conventions document that '.' should only be used in
      the prefix of downstream names.  BlkdebugEvent was a lone
      exception to this.  Changing this is not backwards compatible
      to the 'blockdev-add' QMP command; however, that command is
      not yet fully stable.  It can also be argued that the testsuite
      is the biggest user of blkdebug, and that any other user can
      be taught to deal with the change by paying attention to
      introspection results.
      
      Done with:
      
      $ for str in \
           l1_grow.{alloc,write,activate}_table \
           l2_alloc.{cow_read,write} \
           refblock_alloc.{hookup,write,write_blocks,write_table,switch_table} \
           pwritev_rmw.{head,after_head,tail,after_tail}; do
         str1=$(echo "$str" | sed 's/\./\\./')
         str2=$(echo "$str" | sed 's/\./_/')
         git grep -l "$str1" | xargs -r sed -i "s/$str1/$str2/g"
       done
      
      followed by a manual touchup to test 77 to keep the test working.
      Reported-by: NMarkus Armbruster <armbru@redhat.com>
      CC: Kevin Wolf <kwolf@redhat.com>
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1447836791-369-21-git-send-email-eblake@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      5be5b776
    • E
      blkdebug: Merge hand-rolled and qapi BlkdebugEvent enum · a31939e6
      Eric Blake 提交于
      No need to keep two separate enums, where editing one is likely
      to forget the other.  Now that we can specify a qapi enum prefix,
      we don't even have to change the bulk of the uses.
      
      get_event_by_name() could perhaps be replaced by qapi_enum_parse(),
      but I left that for another day.
      
      CC: Kevin Wolf <kwolf@redhat.com>
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1447836791-369-20-git-send-email-eblake@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      a31939e6
    • E
      qapi: Remove dead visitor code · 75494572
      Eric Blake 提交于
      Commit cbc95538 removed unused start_handle() and end_handle(),
      but forgot to remove their declarations.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1447836791-369-19-git-send-email-eblake@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      75494572
    • E
      qapi: Fix c_name() munging · c43567c1
      Eric Blake 提交于
      The method c_name() is supposed to do two different actions: munge
      '-' into '_', and add a 'q_' prefix to ticklish names.  But it did
      these steps out of order, making it possible to submit input that
      is not ticklish until after munging, where the output then lacked
      the desired prefix.
      
      The failure is exposed easily if you have a compiler that recognizes
      C11 keywords, and try to name a member '_Thread-local', as it would
      result in trying to compile the declaration 'uint64_t _Thread_local;'
      which is not valid.  However, this name violates our conventions
      (ultimately, want to enforce that no qapi names start with single
      underscore), so the test is slightly weaker by instead testing
      'wchar-t'; the declaration 'uint64_t wchar_t;' is valid in C (where
      wchar_t is only a typedef) but would fail with a C++ compiler (where
      it is a keyword).
      
      Fix things by reversing the order of actions within c_name().
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1447836791-369-18-git-send-email-eblake@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      c43567c1
    • E
      qapi: Detect collisions in C member names · 27b60ab9
      Eric Blake 提交于
      Detect attempts to declare two object members that would result
      in the same C member name, by keying the 'seen' dictionary off
      of the C name rather than the qapi name.  It also requires passing
      info through the check_clash() methods.
      
      This addresses a TODO and fixes the previously-broken
      args-name-clash test.  The resulting error message demonstrates
      the utility of the .describe() method added previously.  No change
      to generated code.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1447836791-369-17-git-send-email-eblake@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      27b60ab9
    • E
      qapi: Track owner of each object member · 88d4ef8b
      Eric Blake 提交于
      Future commits will migrate semantic checking away from parsing
      and over to the various QAPISchema*.check() methods.  But to
      report an error message about an incorrect semantic use of a
      member of an object type, it helps to know which type, command,
      or event owns the member.  In particular, when a member is
      inherited from a base type, it is desirable to associate the
      member name with the base type (and not the type calling
      member.check()).
      
      Rather than packing additional information into the seen array
      passed to each member.check() (as in seen[m.name] = {'member':m,
      'owner':type}), it is easier to have each member track the name
      of the owner type in the first place (keeping things simpler
      with the existing seen[m.name] = m).  The new member.owner field
      is set via a new set_owner() method, called when registering
      the members and variants arrays with an object or variant type.
      Track only a name, and not the actual type object, to avoid
      creating a circular python reference chain.
      
      Note that Variants.set_owner() method does not set the owner
      for the tag_member field; this field is set earlier either as
      part of an object's non-variant members, or explicitly by
      alternates.
      
      The source information is intended for human consumption in
      error messages, and a new describe() method is added to access
      the resulting information.  For example, given the qapi:
        { 'command': 'foo', 'data': { 'string': 'str' } }
      an implementation of visit_command() that calls
        arg_type.members[0].describe()
      will see "'string' (parameter of foo)".
      
      To make the human-readable name of implicit types work without
      duplicating efforts, the describe() method has to reverse the
      name of implicit types, via the helper _pretty_owner().
      
      No change to generated code.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1447836791-369-16-git-send-email-eblake@redhat.com>
      [Incorrect & unused -wrapper case in _pretty_owner() dropped]
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      88d4ef8b
    • E
      qapi: Remove outdated tests related to QMP/branch collisions · 61a94661
      Eric Blake 提交于
      Now that branches are in a separate C namespace, we can remove
      the restrictions in the parser that claim a branch name would
      collide with QMP, and delete the negative tests that are no
      longer problematic.  A separate patch can then add positive
      tests to qapi-schema-test to test that any corner cases will
      compile correctly.
      
      This reverts the scripts/qapi.py portion of commit 7b2a5c2f,
      now that the assertions that it plugged are no longer possible.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <1447836791-369-15-git-send-email-eblake@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      61a94661