intel_iommu.c (a58614391d52ef8240071c1db5db6aceaf66a3ea) intel_iommu.c (80de52ba87d44bf63157900b8dd5ccd5bd795fd4)
1/*
2 * QEMU emulation of an Intel IOMMU (VT-d)
3 * (DMA Remapping device)
4 *
5 * Copyright (C) 2013 Knut Omang, Oracle <knut.omang@oracle.com>
6 * Copyright (C) 2014 Le Tan, <tamlokveer@gmail.com>
7 *
8 * This program is free software; you can redistribute it and/or modify

--- 1169 unchanged lines hidden (view full) ---

1178
1179 /* Clear the index of Fault Recording Register */
1180 s->next_frcd_reg = 0;
1181 /* Ok - report back to driver */
1182 vtd_set_clear_mask_long(s, DMAR_GSTS_REG, VTD_GSTS_TES, 0);
1183 }
1184}
1185
1/*
2 * QEMU emulation of an Intel IOMMU (VT-d)
3 * (DMA Remapping device)
4 *
5 * Copyright (C) 2013 Knut Omang, Oracle <knut.omang@oracle.com>
6 * Copyright (C) 2014 Le Tan, <tamlokveer@gmail.com>
7 *
8 * This program is free software; you can redistribute it and/or modify

--- 1169 unchanged lines hidden (view full) ---

1178
1179 /* Clear the index of Fault Recording Register */
1180 s->next_frcd_reg = 0;
1181 /* Ok - report back to driver */
1182 vtd_set_clear_mask_long(s, DMAR_GSTS_REG, VTD_GSTS_TES, 0);
1183 }
1184}
1185
1186/* Handle Interrupt Remap Enable/Disable */
1187static void vtd_handle_gcmd_ire(IntelIOMMUState *s, bool en)
1188{
1189 VTD_DPRINTF(CSR, "Interrupt Remap Enable %s", (en ? "on" : "off"));
1190
1191 if (en) {
1192 s->intr_enabled = true;
1193 /* Ok - report back to driver */
1194 vtd_set_clear_mask_long(s, DMAR_GSTS_REG, 0, VTD_GSTS_IRES);
1195 } else {
1196 s->intr_enabled = false;
1197 /* Ok - report back to driver */
1198 vtd_set_clear_mask_long(s, DMAR_GSTS_REG, VTD_GSTS_IRES, 0);
1199 }
1200}
1201
1186/* Handle write to Global Command Register */
1187static void vtd_handle_gcmd_write(IntelIOMMUState *s)
1188{
1189 uint32_t status = vtd_get_long_raw(s, DMAR_GSTS_REG);
1190 uint32_t val = vtd_get_long_raw(s, DMAR_GCMD_REG);
1191 uint32_t changed = status ^ val;
1192
1193 VTD_DPRINTF(CSR, "value 0x%"PRIx32 " status 0x%"PRIx32, val, status);

--- 8 unchanged lines hidden (view full) ---

1202 if (changed & VTD_GCMD_QIE) {
1203 /* Queued Invalidation Enable */
1204 vtd_handle_gcmd_qie(s, val & VTD_GCMD_QIE);
1205 }
1206 if (val & VTD_GCMD_SIRTP) {
1207 /* Set/update the interrupt remapping root-table pointer */
1208 vtd_handle_gcmd_sirtp(s);
1209 }
1202/* Handle write to Global Command Register */
1203static void vtd_handle_gcmd_write(IntelIOMMUState *s)
1204{
1205 uint32_t status = vtd_get_long_raw(s, DMAR_GSTS_REG);
1206 uint32_t val = vtd_get_long_raw(s, DMAR_GCMD_REG);
1207 uint32_t changed = status ^ val;
1208
1209 VTD_DPRINTF(CSR, "value 0x%"PRIx32 " status 0x%"PRIx32, val, status);

--- 8 unchanged lines hidden (view full) ---

1218 if (changed & VTD_GCMD_QIE) {
1219 /* Queued Invalidation Enable */
1220 vtd_handle_gcmd_qie(s, val & VTD_GCMD_QIE);
1221 }
1222 if (val & VTD_GCMD_SIRTP) {
1223 /* Set/update the interrupt remapping root-table pointer */
1224 vtd_handle_gcmd_sirtp(s);
1225 }
1226 if (changed & VTD_GCMD_IRE) {
1227 /* Interrupt remap enable/disable */
1228 vtd_handle_gcmd_ire(s, val & VTD_GCMD_IRE);
1229 }
1210}
1211
1212/* Handle write to Context Command Register */
1213static void vtd_handle_ccmd_write(IntelIOMMUState *s)
1214{
1215 uint64_t ret;
1216 uint64_t val = vtd_get_quad_raw(s, DMAR_CCMD_REG);
1217

--- 937 unchanged lines hidden ---
1230}
1231
1232/* Handle write to Context Command Register */
1233static void vtd_handle_ccmd_write(IntelIOMMUState *s)
1234{
1235 uint64_t ret;
1236 uint64_t val = vtd_get_quad_raw(s, DMAR_CCMD_REG);
1237

--- 937 unchanged lines hidden ---