Commit b18a990c authored by Peter Maydell's avatar Peter Maydell
Browse files

Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging



pc,net,MAINTAINERS,build updates

MAINTAINERS updated with link to the security process documentation
apic version modified to make more guests happy
On top of that, bugfixes all over the place

Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>

# gpg: Signature made Wed 07 May 2014 17:15:29 BST using RSA key ID D28D5469
# gpg: Good signature from "Michael S. Tsirkin <mst@kernel.org>"
# gpg:                 aka "Michael S. Tsirkin <mst@redhat.com>"

* remotes/mst/tags/for_upstream:
  configure: make source tree build more robust
  MAINTAINERS: addresses for responsible disclosure
  pm_smbus: correctly report unclaimed cycles
  smbus: return -1 if nothing found at the given address
  smbus: allow returning an error from reads
  apic: use emulated lapic version 0x14 on pc machines >= 2.1
  pc: add compat_props placeholder for 2.0 machine type
  i8259: don't abort when trying to use level sensitive irqs
  acpi: fix tables for no-hpet configuration
  acpi-build: properly decrement objects' reference counters
  acpi/pcihp.c: Rewrite acpi_pcihp_get_bsel using object_property_get_int

Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
parents 8d1dc5d1 cab00a5a
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -52,6 +52,13 @@ General Project Administration
------------------------------
M: Anthony Liguori <aliguori@amazon.com>

Responsible Disclosure, Reporting Security Issues
------------------------------
W: http://wiki.qemu.org/SecurityProcess
M: Michael S. Tsirkin <mst@redhat.com>
M: Anthony Liguori <aliguori@amazon.com>
L: secalert@redhat.com

Guest CPU cores (TCG):
----------------------
Alpha
+10 −2
Original line number Diff line number Diff line
@@ -403,6 +403,14 @@ fi
# make source path absolute
source_path=`cd "$source_path"; pwd`

# running configure in the source tree?
# we know that's the case if configure is there.
if test -f "./configure"; then
    pwd_is_source_path="y"
else
    pwd_is_source_path="n"
fi

check_define() {
cat > $TMPC <<EOF
#if !defined($1)
@@ -2940,7 +2948,7 @@ EOF
    fdt=yes
    dtc_internal="yes"
    mkdir -p dtc
    if [ "$source_path" != `pwd` ] ; then
    if [ "$pwd_is_source_path" != "y" ] ; then
       symlink "$source_path/dtc/Makefile" "dtc/Makefile"
       symlink "$source_path/dtc/scripts" "dtc/scripts"
    fi
@@ -5176,7 +5184,7 @@ do
done
mkdir -p $DIRS
for f in $FILES ; do
    if [ -e "$source_path/$f" ] && [ "$source_path" != `pwd` ]; then
    if [ -e "$source_path/$f" ] && [ "$pwd_is_source_path" != "y" ]; then
        symlink "$source_path/$f" "$f"
    fi
done
+10 −8
Original line number Diff line number Diff line
@@ -63,17 +63,19 @@ typedef struct AcpiPciHpFind {

static int acpi_pcihp_get_bsel(PCIBus *bus)
{
    QObject *o = object_property_get_qobject(OBJECT(bus),
                                             ACPI_PCIHP_PROP_BSEL, NULL);
    int64_t bsel = -1;
    if (o) {
        bsel = qint_get_int(qobject_to_qint(o));
    Error *local_err = NULL;
    int64_t bsel = object_property_get_int(OBJECT(bus), ACPI_PCIHP_PROP_BSEL,
                                           &local_err);

    if (local_err || bsel < 0 || bsel >= ACPI_PCIHP_MAX_HOTPLUG_BUS) {
        if (local_err) {
            error_free(local_err);
        }
    if (bsel < 0) {
        return -1;
    }
    } else {
        return bsel;
    }
}

static void acpi_pcihp_test_hotplug_bus(PCIBus *bus, void *opaque)
{
+41 −22
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ static void smb_transaction(PMSMBus *s)
    uint8_t cmd = s->smb_cmd;
    uint8_t addr = s->smb_addr >> 1;
    I2CBus *bus = s->smbus;
    int ret;

    SMBUS_DPRINTF("SMBus trans addr=0x%02x prot=0x%02x\n", addr, prot);
    /* Transaction isn't exec if STS_DEV_ERR bit set */
@@ -68,51 +69,69 @@ static void smb_transaction(PMSMBus *s)
    }
    switch(prot) {
    case 0x0:
        smbus_quick_command(bus, addr, read);
        s->smb_stat |= STS_BYTE_DONE | STS_INTR;
        break;
        ret = smbus_quick_command(bus, addr, read);
        goto done;
    case 0x1:
        if (read) {
            s->smb_data0 = smbus_receive_byte(bus, addr);
            ret = smbus_receive_byte(bus, addr);
            goto data8;
        } else {
            smbus_send_byte(bus, addr, cmd);
            ret = smbus_send_byte(bus, addr, cmd);
            goto done;
        }
        s->smb_stat |= STS_BYTE_DONE | STS_INTR;
        break;
    case 0x2:
        if (read) {
            s->smb_data0 = smbus_read_byte(bus, addr, cmd);
            ret = smbus_read_byte(bus, addr, cmd);
            goto data8;
        } else {
            smbus_write_byte(bus, addr, cmd, s->smb_data0);
            ret = smbus_write_byte(bus, addr, cmd, s->smb_data0);
            goto done;
        }
        s->smb_stat |= STS_BYTE_DONE | STS_INTR;
        break;
    case 0x3:
        if (read) {
            uint16_t val;
            val = smbus_read_word(bus, addr, cmd);
            s->smb_data0 = val;
            s->smb_data1 = val >> 8;
            ret = smbus_read_word(bus, addr, cmd);
            goto data16;
        } else {
            smbus_write_word(bus, addr, cmd, (s->smb_data1 << 8) | s->smb_data0);
            ret = smbus_write_word(bus, addr, cmd, (s->smb_data1 << 8) | s->smb_data0);
            goto done;
        }
        s->smb_stat |= STS_BYTE_DONE | STS_INTR;
        break;
    case 0x5:
        if (read) {
            s->smb_data0 = smbus_read_block(bus, addr, cmd, s->smb_data);
            ret = smbus_read_block(bus, addr, cmd, s->smb_data);
            goto data8;
        } else {
            smbus_write_block(bus, addr, cmd, s->smb_data, s->smb_data0);
            ret = smbus_write_block(bus, addr, cmd, s->smb_data, s->smb_data0);
            goto done;
        }
        s->smb_stat |= STS_BYTE_DONE | STS_INTR;
        break;
    default:
        goto error;
    }
    abort();

data16:
    if (ret < 0) {
        goto error;
    }
    s->smb_data1 = ret >> 8;
data8:
    if (ret < 0) {
        goto error;
    }
    s->smb_data0 = ret;
done:
    if (ret < 0) {
        goto error;
    }
    s->smb_stat |= STS_BYTE_DONE | STS_INTR;
    return;

error:
    s->smb_stat |= STS_DEV_ERR;
    return;

}

static void smb_ioport_writeb(void *opaque, hwaddr addr, uint64_t val,
+47 −21
Original line number Diff line number Diff line
@@ -208,34 +208,44 @@ static int smbus_device_init(I2CSlave *i2c)
}

/* Master device commands.  */
void smbus_quick_command(I2CBus *bus, uint8_t addr, int read)
int smbus_quick_command(I2CBus *bus, uint8_t addr, int read)
{
    i2c_start_transfer(bus, addr, read);
    if (i2c_start_transfer(bus, addr, read)) {
        return -1;
    }
    i2c_end_transfer(bus);
    return 0;
}

uint8_t smbus_receive_byte(I2CBus *bus, uint8_t addr)
int smbus_receive_byte(I2CBus *bus, uint8_t addr)
{
    uint8_t data;

    i2c_start_transfer(bus, addr, 1);
    if (i2c_start_transfer(bus, addr, 1)) {
        return -1;
    }
    data = i2c_recv(bus);
    i2c_nack(bus);
    i2c_end_transfer(bus);
    return data;
}

void smbus_send_byte(I2CBus *bus, uint8_t addr, uint8_t data)
int smbus_send_byte(I2CBus *bus, uint8_t addr, uint8_t data)
{
    i2c_start_transfer(bus, addr, 0);
    if (i2c_start_transfer(bus, addr, 0)) {
        return -1;
    }
    i2c_send(bus, data);
    i2c_end_transfer(bus);
    return 0;
}

uint8_t smbus_read_byte(I2CBus *bus, uint8_t addr, uint8_t command)
int smbus_read_byte(I2CBus *bus, uint8_t addr, uint8_t command)
{
    uint8_t data;
    i2c_start_transfer(bus, addr, 0);
    if (i2c_start_transfer(bus, addr, 0)) {
        return -1;
    }
    i2c_send(bus, command);
    i2c_start_transfer(bus, addr, 1);
    data = i2c_recv(bus);
@@ -244,18 +254,23 @@ uint8_t smbus_read_byte(I2CBus *bus, uint8_t addr, uint8_t command)
    return data;
}

void smbus_write_byte(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t data)
int smbus_write_byte(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t data)
{
    i2c_start_transfer(bus, addr, 0);
    if (i2c_start_transfer(bus, addr, 0)) {
        return -1;
    }
    i2c_send(bus, command);
    i2c_send(bus, data);
    i2c_end_transfer(bus);
    return 0;
}

uint16_t smbus_read_word(I2CBus *bus, uint8_t addr, uint8_t command)
int smbus_read_word(I2CBus *bus, uint8_t addr, uint8_t command)
{
    uint16_t data;
    i2c_start_transfer(bus, addr, 0);
    if (i2c_start_transfer(bus, addr, 0)) {
        return -1;
    }
    i2c_send(bus, command);
    i2c_start_transfer(bus, addr, 1);
    data = i2c_recv(bus);
@@ -265,13 +280,16 @@ uint16_t smbus_read_word(I2CBus *bus, uint8_t addr, uint8_t command)
    return data;
}

void smbus_write_word(I2CBus *bus, uint8_t addr, uint8_t command, uint16_t data)
int smbus_write_word(I2CBus *bus, uint8_t addr, uint8_t command, uint16_t data)
{
    i2c_start_transfer(bus, addr, 0);
    if (i2c_start_transfer(bus, addr, 0)) {
        return -1;
    }
    i2c_send(bus, command);
    i2c_send(bus, data & 0xff);
    i2c_send(bus, data >> 8);
    i2c_end_transfer(bus);
    return 0;
}

int smbus_read_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data)
@@ -279,20 +297,24 @@ int smbus_read_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data)
    int len;
    int i;

    i2c_start_transfer(bus, addr, 0);
    if (i2c_start_transfer(bus, addr, 0)) {
        return -1;
    }
    i2c_send(bus, command);
    i2c_start_transfer(bus, addr, 1);
    len = i2c_recv(bus);
    if (len > 32)
    if (len > 32) {
        len = 0;
    for (i = 0; i < len; i++)
    }
    for (i = 0; i < len; i++) {
        data[i] = i2c_recv(bus);
    }
    i2c_nack(bus);
    i2c_end_transfer(bus);
    return len;
}

void smbus_write_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data,
int smbus_write_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data,
                      int len)
{
    int i;
@@ -300,12 +322,16 @@ void smbus_write_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data
    if (len > 32)
        len = 32;

    i2c_start_transfer(bus, addr, 0);
    if (i2c_start_transfer(bus, addr, 0)) {
        return -1;
    }
    i2c_send(bus, command);
    i2c_send(bus, len);
    for (i = 0; i < len; i++)
    for (i = 0; i < len; i++) {
        i2c_send(bus, data[i]);
    }
    i2c_end_transfer(bus);
    return 0;
}

static void smbus_device_class_init(ObjectClass *klass, void *data)
Loading