)]}'
{
  "commit": "bdc0c4d1c7f847cf0d43ab119a74eba0fa4f8bb7",
  "tree": "c315cab84921c438937b6f58885042fb55ecfd75",
  "parents": [
    "3d6527cb214a1546d632e9d320e6010a0bd0efe5"
  ],
  "author": {
    "name": "David Greenaway",
    "email": "dgreenaway@google.com",
    "time": "Fri Dec 03 08:46:10 2021 +0000"
  },
  "committer": {
    "name": "Commit Bot",
    "email": "commit-bot@chromium.org",
    "time": "Fri Dec 03 08:46:10 2021 +0000"
  },
  "message": "[vmm] Implement mask/unmask support in IO APIC\n\nOur current IO APIC doesn\u0027t support masking / unmasking interrupts.\nInstead, received interrupts will always be immediately forwarded to\nwhatever is configured in their redirect entry.\n\nWe have mostly gotten away with this imperfect implementation so far:\nguest kernels sometimes complain about spurious interrupts, but\notherwise handle things just fine.\n\nMore recent Linux kernels however have changed how they perform IO APIC\nshutdown. During shutdown, each IO APIC redirect register is set to\nmasked, but otherwise zeroed out. If, during shutdown, an interrupt\nhappens to fire, our IO APIC implementation will ignore the mask bit and\ninstead deliver an interrupt to vector 0, which is interpreted by guests\nas a divide-by-zero exception. http://fxbug.dev/82015 is an example of\nsuch a bug.\n\nThis CL adds support for masking/unmasking interrupts in the IO APIC:\n\n * If an IRQ is received while it is unmasked, nothing changes.\n\n * If an IRQ is received while it is masked, it is marked as pending.\n   When it is finally unmasked, the current value in the IRQ\u0027s redirect\n   register will be used as the destination.\n\nFixed: 82015\n\nChange-Id: I0c3d3b145fb8a025b33d7d169c8022cac2c2bc87\nReviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/613549\nCommit-Queue: Auto-Submit \u003cauto-submit@fuchsia-infra.iam.gserviceaccount.com\u003e\nFuchsia-Auto-Submit: David Greenaway \u003cdgreenaway@google.com\u003e\nReviewed-by: Abdulla Kamar \u003cabdulla@google.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "c52852f60c18737a81a0d1aa71614b824dedb72b",
      "old_mode": 33188,
      "old_path": "src/virtualization/bin/vmm/arch/x64/io_apic.cc",
      "new_id": "598f4c63beae85c336da017912356e597ddfc675",
      "new_mode": 33188,
      "new_path": "src/virtualization/bin/vmm/arch/x64/io_apic.cc"
    },
    {
      "type": "modify",
      "old_id": "b85c45b2911091ef0ec13dbe27a82970210662fb",
      "old_mode": 33188,
      "old_path": "src/virtualization/bin/vmm/arch/x64/io_apic.h",
      "new_id": "5a3579c71235485bae6d7eabfe504357e8842291",
      "new_mode": 33188,
      "new_path": "src/virtualization/bin/vmm/arch/x64/io_apic.h"
    },
    {
      "type": "modify",
      "old_id": "3b2212e8adbee0c913fe1d4929cac435103b2df3",
      "old_mode": 33188,
      "old_path": "src/virtualization/bin/vmm/arch/x64/io_apic_registers.h",
      "new_id": "9e67c93d7a502bceb80bec11e4cd0c52414b35f3",
      "new_mode": 33188,
      "new_path": "src/virtualization/bin/vmm/arch/x64/io_apic_registers.h"
    },
    {
      "type": "modify",
      "old_id": "dc7900dfa917a38d517d95e6a222da1fba3f00f9",
      "old_mode": 33188,
      "old_path": "src/virtualization/bin/vmm/arch/x64/io_apic_unittest.cc",
      "new_id": "c7677d34f69015298b706af550891b8db39bc9fd",
      "new_mode": 33188,
      "new_path": "src/virtualization/bin/vmm/arch/x64/io_apic_unittest.cc"
    }
  ]
}
