cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

libhw.c (2321B)


      1/*
      2 * QEMU USB emulation, libhw bits.
      3 *
      4 * Permission is hereby granted, free of charge, to any person obtaining a copy
      5 * of this software and associated documentation files (the "Software"), to deal
      6 * in the Software without restriction, including without limitation the rights
      7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
      8 * copies of the Software, and to permit persons to whom the Software is
      9 * furnished to do so, subject to the following conditions:
     10 *
     11 * The above copyright notice and this permission notice shall be included in
     12 * all copies or substantial portions of the Software.
     13 *
     14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
     17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     20 * THE SOFTWARE.
     21 */
     22#include "qemu/osdep.h"
     23#include "hw/usb.h"
     24#include "sysemu/dma.h"
     25
     26int usb_packet_map(USBPacket *p, QEMUSGList *sgl)
     27{
     28    DMADirection dir = (p->pid == USB_TOKEN_IN) ?
     29        DMA_DIRECTION_FROM_DEVICE : DMA_DIRECTION_TO_DEVICE;
     30    void *mem;
     31    int i;
     32
     33    for (i = 0; i < sgl->nsg; i++) {
     34        dma_addr_t base = sgl->sg[i].base;
     35        dma_addr_t len = sgl->sg[i].len;
     36
     37        while (len) {
     38            dma_addr_t xlen = len;
     39            mem = dma_memory_map(sgl->as, base, &xlen, dir);
     40            if (!mem) {
     41                goto err;
     42            }
     43            if (xlen > len) {
     44                xlen = len;
     45            }
     46            qemu_iovec_add(&p->iov, mem, xlen);
     47            len -= xlen;
     48            base += xlen;
     49        }
     50    }
     51    return 0;
     52
     53err:
     54    usb_packet_unmap(p, sgl);
     55    return -1;
     56}
     57
     58void usb_packet_unmap(USBPacket *p, QEMUSGList *sgl)
     59{
     60    DMADirection dir = (p->pid == USB_TOKEN_IN) ?
     61        DMA_DIRECTION_FROM_DEVICE : DMA_DIRECTION_TO_DEVICE;
     62    int i;
     63
     64    for (i = 0; i < p->iov.niov; i++) {
     65        dma_memory_unmap(sgl->as, p->iov.iov[i].iov_base,
     66                         p->iov.iov[i].iov_len, dir,
     67                         p->iov.iov[i].iov_len);
     68    }
     69}