From nobody Mon Apr 29 21:30:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1491325438011210.7265277234102; Tue, 4 Apr 2017 10:03:58 -0700 (PDT) Received: from localhost ([::1]:36804 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cvRs4-00065M-0K for importer@patchew.org; Tue, 04 Apr 2017 13:03:56 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36829) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cvRpU-0003wv-Bi for qemu-devel@nongnu.org; Tue, 04 Apr 2017 13:01:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cvRpS-0002z5-3k for qemu-devel@nongnu.org; Tue, 04 Apr 2017 13:01:16 -0400 Received: from mail-qt0-x243.google.com ([2607:f8b0:400d:c0d::243]:34074) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cvRpR-0002yk-WD for qemu-devel@nongnu.org; Tue, 04 Apr 2017 13:01:14 -0400 Received: by mail-qt0-x243.google.com with SMTP id x35so23969625qtc.1 for ; Tue, 04 Apr 2017 10:01:13 -0700 (PDT) Received: from HEDWIG.ini.cmu.edu (HEDWIG.INI.CMU.EDU. [128.2.16.51]) by smtp.gmail.com with ESMTPSA id z196sm12239899qkb.42.2017.04.04.10.01.11 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 04 Apr 2017 10:01:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=DkNGlQLcQftVgF3+Q3CndciGu9Rmyl8wFAp/F1B/QuY=; b=FIqkQCyHEtxWkHhXrevDv5gcbKNPLITpEFEuVYRRv7AeSt1ePcBLiRSDBGoZSij2z2 LeACgHO1XAUSTI58A0bmVgQHih2MpD74ey0Xz63/UkC+n+59jMgQ3cupEWTdBTK85NUF PkxR3p+wsA6m/emJge9MTZXeu7pB9gLotr275fi8JsBJq04YKsNHBEQKfrnHPK3cKAgH Arw21HX64XxVGLgKyAvVwlurTh3QPtFj+1Po2UH686nx5GBlNDWiuyK+Bcv28IOFQzsh d2eWYctEa7VrujuqokGJ1JBUxJlOPt+RrUtrmayfvM6f3bx4ctDAHi3I1spyoTM5krA1 bVgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=DkNGlQLcQftVgF3+Q3CndciGu9Rmyl8wFAp/F1B/QuY=; b=QpjR8LHECzI50Danq1/UT7SFx2qw+TaQ0m3N7OKhOO4YONABvEc5I7PHNWB80gXzAn GbOoVpTEYTQYm3dXG4caR4YYKmaIVG5y9cAhWaQau/ziwBM+vAP14jKeIViomQMjYjON DzNFFR5O0lqRxeYz6NxdHQo7xYYU45CWKMScPBkyfE8CZPuW5JvF9pJ8Nvl9/Gr4pOMs +SsuQcnohUH2/JxVINhfngBBDm/FjHHSU/ecJpMRwkNy26D/CuMstWcNiMY2QWAz6Qek cZYjVJlaiSK6WKQ3Ty9gU2zybd5QDFqrfcqtO7sTQgZenHT7FiPsQvJcDby8P7jlAjm2 IZcg== X-Gm-Message-State: AFeK/H2CkmEOyJGMo7IM6qtW8Ila9WRWlJtgnHQp7qJluGLGLdd1SnXpevQwMcipfMgYXw== X-Received: by 10.200.34.38 with SMTP id o35mr24450731qto.226.1491325273230; Tue, 04 Apr 2017 10:01:13 -0700 (PDT) From: "Gabriel L. Somlo" To: qemu-devel@nongnu.org Date: Tue, 4 Apr 2017 13:01:02 -0400 Message-Id: <1491325264-14502-2-git-send-email-gsomlo@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1491325264-14502-1-git-send-email-gsomlo@gmail.com> References: <1491325264-14502-1-git-send-email-gsomlo@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2607:f8b0:400d:c0d::243 Subject: [Qemu-devel] [PATCH v2 1/3] applesmc: cosmetic whitespace and indentation cleanup X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pbonzini@redhat.com, eshelton@pobox.com, f4bug@amsat.org, agraf@suse.de Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Signed-off-by: Gabriel Somlo Reviewed-by: Alexander Graf Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Phil Dennis-Jordan --- hw/misc/applesmc.c | 98 ++++++++++++++++++++++++++++----------------------= ---- 1 file changed, 50 insertions(+), 48 deletions(-) diff --git a/hw/misc/applesmc.c b/hw/misc/applesmc.c index 77fab5b..6381197 100644 --- a/hw/misc/applesmc.c +++ b/hw/misc/applesmc.c @@ -39,21 +39,24 @@ /* #define DEBUG_SMC */ =20 #define APPLESMC_DEFAULT_IOBASE 0x300 -/* data port used by Apple SMC */ -#define APPLESMC_DATA_PORT 0x0 -/* command/status port used by Apple SMC */ -#define APPLESMC_CMD_PORT 0x4 -#define APPLESMC_NR_PORTS 32 =20 -#define APPLESMC_READ_CMD 0x10 -#define APPLESMC_WRITE_CMD 0x11 -#define APPLESMC_GET_KEY_BY_INDEX_CMD 0x12 -#define APPLESMC_GET_KEY_TYPE_CMD 0x13 +enum { + APPLESMC_DATA_PORT =3D 0x00, + APPLESMC_CMD_PORT =3D 0x04, + APPLESMC_NUM_PORTS =3D 0x20, +}; + +enum { + APPLESMC_READ_CMD =3D 0x10, + APPLESMC_WRITE_CMD =3D 0x11, + APPLESMC_GET_KEY_BY_INDEX_CMD =3D 0x12, + APPLESMC_GET_KEY_TYPE_CMD =3D 0x13, +}; =20 #ifdef DEBUG_SMC #define smc_debug(...) fprintf(stderr, "AppleSMC: " __VA_ARGS__) #else -#define smc_debug(...) do { } while(0) +#define smc_debug(...) do { } while (0) #endif =20 static char default_osk[64] =3D "This is a dummy key. Enter the real key " @@ -77,12 +80,11 @@ struct AppleSMCState { uint32_t iobase; uint8_t cmd; uint8_t status; - uint8_t key[4]; + char key[4]; uint8_t read_pos; uint8_t data_len; uint8_t data_pos; uint8_t data[255]; - uint8_t charactic[4]; char *osk; QLIST_HEAD(, AppleSMCData) data_def; }; @@ -93,10 +95,10 @@ static void applesmc_io_cmd_write(void *opaque, hwaddr = addr, uint64_t val, AppleSMCState *s =3D opaque; =20 smc_debug("CMD Write B: %#x =3D %#x\n", addr, val); - switch(val) { - case APPLESMC_READ_CMD: - s->status =3D 0x0c; - break; + switch (val) { + case APPLESMC_READ_CMD: + s->status =3D 0x0c; + break; } s->cmd =3D val; s->read_pos =3D 0; @@ -123,54 +125,54 @@ static void applesmc_io_data_write(void *opaque, hwad= dr addr, uint64_t val, AppleSMCState *s =3D opaque; =20 smc_debug("DATA Write B: %#x =3D %#x\n", addr, val); - switch(s->cmd) { - case APPLESMC_READ_CMD: - if(s->read_pos < 4) { - s->key[s->read_pos] =3D val; - s->status =3D 0x04; - } else if(s->read_pos =3D=3D 4) { - s->data_len =3D val; - s->status =3D 0x05; - s->data_pos =3D 0; - smc_debug("Key =3D %c%c%c%c Len =3D %d\n", s->key[0], - s->key[1], s->key[2], s->key[3], val); - applesmc_fill_data(s); - } - s->read_pos++; - break; + switch (s->cmd) { + case APPLESMC_READ_CMD: + if (s->read_pos < 4) { + s->key[s->read_pos] =3D val; + s->status =3D 0x04; + } else if (s->read_pos =3D=3D 4) { + s->data_len =3D val; + s->status =3D 0x05; + s->data_pos =3D 0; + smc_debug("Key =3D %c%c%c%c Len =3D %d\n", s->key[0], + s->key[1], s->key[2], s->key[3], val); + applesmc_fill_data(s); + } + s->read_pos++; + break; } } =20 -static uint64_t applesmc_io_data_read(void *opaque, hwaddr addr1, - unsigned size) +static uint64_t applesmc_io_data_read(void *opaque, hwaddr addr, unsigned = size) { AppleSMCState *s =3D opaque; uint8_t retval =3D 0; =20 - switch(s->cmd) { - case APPLESMC_READ_CMD: - if(s->data_pos < s->data_len) { - retval =3D s->data[s->data_pos]; - smc_debug("READ_DATA[%d] =3D %#hhx\n", s->data_pos, - retval); - s->data_pos++; - if(s->data_pos =3D=3D s->data_len) { - s->status =3D 0x00; - smc_debug("EOF\n"); - } else - s->status =3D 0x05; + switch (s->cmd) { + case APPLESMC_READ_CMD: + if (s->data_pos < s->data_len) { + retval =3D s->data[s->data_pos]; + smc_debug("READ_DATA[%d] =3D %#hhx\n", s->data_pos, + retval); + s->data_pos++; + if (s->data_pos =3D=3D s->data_len) { + s->status =3D 0x00; + smc_debug("EOF\n"); + } else { + s->status =3D 0x05; } + } } - smc_debug("DATA Read b: %#x =3D %#x\n", addr1, retval); + smc_debug("DATA Read b: %#x =3D %#x\n", addr, retval); =20 return retval; } =20 -static uint64_t applesmc_io_cmd_read(void *opaque, hwaddr addr1, unsigned = size) +static uint64_t applesmc_io_cmd_read(void *opaque, hwaddr addr, unsigned s= ize) { AppleSMCState *s =3D opaque; =20 - smc_debug("CMD Read B: %#x\n", addr1); + smc_debug("CMD Read B: %#x\n", addr); return s->status; } =20 --=20 2.7.4 From nobody Mon Apr 29 21:30:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1491325487385572.843197912382; Tue, 4 Apr 2017 10:04:47 -0700 (PDT) Received: from localhost ([::1]:36808 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cvRss-0006e3-3Z for importer@patchew.org; Tue, 04 Apr 2017 13:04:46 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36837) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cvRpU-0003xE-QT for qemu-devel@nongnu.org; Tue, 04 Apr 2017 13:01:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cvRpT-000304-KI for qemu-devel@nongnu.org; Tue, 04 Apr 2017 13:01:16 -0400 Received: from mail-qk0-x244.google.com ([2607:f8b0:400d:c09::244]:33021) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cvRpT-0002zi-GD for qemu-devel@nongnu.org; Tue, 04 Apr 2017 13:01:15 -0400 Received: by mail-qk0-x244.google.com with SMTP id p22so24561606qka.0 for ; Tue, 04 Apr 2017 10:01:15 -0700 (PDT) Received: from HEDWIG.ini.cmu.edu (HEDWIG.INI.CMU.EDU. [128.2.16.51]) by smtp.gmail.com with ESMTPSA id z196sm12239899qkb.42.2017.04.04.10.01.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 04 Apr 2017 10:01:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=R4+zWlwTyt/OVXlZnCP7BUU+T0UHYoSYaSnurox8WkM=; b=KvPz7bRQ3GifofMpKZ4FyuzLtHqXVcOXXP7heUVZo8D4i96bRpEvZBQs3u/nZm8/hR Ywpcv6NZuwLZLxzEMz21jiJlspJdm5AJ62r7xE4P8Ed2WVdK89HRsqRXigQ5XcNZN7/P ns99uvsxzkjWDNYZ2EH+E3pp6/0B3fBvmEp9I+dKRhOpEot90/JKwSxLAxwJDfGES6NP D+uwz7SAmoqiAXZuHcCof134MxP+9MHtIi0yGA+j5AvATRTBI3ntcb9TMae24YmxmgV1 sb5+YlJFwQCalwZeXN8zdCVBLuA+/PJpKsy+7HMWFp99rb3uIOjyuhPRSH1CvhvzsJot iHgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=R4+zWlwTyt/OVXlZnCP7BUU+T0UHYoSYaSnurox8WkM=; b=eZuANRPgBSk+WkHjqjZcN2TwFTl6q4e6jA/ZrvICqadBBAyxF4d4NDjrx3eirUQ79j 3svRsFEuhtEDIReSYMgScYJuaMf5waNeve8Lu7sKIKHtb1PZo+U+5/FbzMx3N3ND5VNe p26VJP2LEYDq7X0dB1WvfxV+/JazXvMZRxkQG+1xyWBJrBa3EK5I7IL0QbzVpx1vjroY 6D4ubUEBI18qdN4OnvtnFkav6oEaGz96RF75vIqf0MnUx81aJx7MO4PhztTspEheoswe SFuJ5YIQ10fwcUDDA859gMZVRfdzQQKvnf8Z+6UJRh7LCAVYzpWL1pNYig7pCS/nfd8Q /QMg== X-Gm-Message-State: AFeK/H174QtaE9BCh1c4bUQpfrG63GY5wnQATrZwXThubBpLYMFwoFb4KAtNvt09KU3HeQ== X-Received: by 10.55.100.134 with SMTP id y128mr10130793qkb.291.1491325274699; Tue, 04 Apr 2017 10:01:14 -0700 (PDT) From: "Gabriel L. Somlo" To: qemu-devel@nongnu.org Date: Tue, 4 Apr 2017 13:01:03 -0400 Message-Id: <1491325264-14502-3-git-send-email-gsomlo@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1491325264-14502-1-git-send-email-gsomlo@gmail.com> References: <1491325264-14502-1-git-send-email-gsomlo@gmail.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2607:f8b0:400d:c09::244 Subject: [Qemu-devel] [PATCH v2 2/3] applesmc: implement error status port X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pbonzini@redhat.com, eshelton@pobox.com, f4bug@amsat.org, agraf@suse.de Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" As of release 10.12.4, OS X (Sierra) refuses to boot unless the AppleSMC supports an additional I/O port, expected to provide an error status code. Update the [cmd|data]_write() and data_read() methods to implement the required state machine, and add I/O region & methods to handle access to the error port. Originally proposed by Eric Shelton Signed-off-by: Gabriel Somlo Reviewed-by: Alexander Graf Reviewed-by: Phil Dennis-Jordan Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- hw/misc/applesmc.c | 141 +++++++++++++++++++++++++++++++++++++++++++------= ---- 1 file changed, 115 insertions(+), 26 deletions(-) diff --git a/hw/misc/applesmc.c b/hw/misc/applesmc.c index 6381197..0d882e8 100644 --- a/hw/misc/applesmc.c +++ b/hw/misc/applesmc.c @@ -43,6 +43,7 @@ enum { APPLESMC_DATA_PORT =3D 0x00, APPLESMC_CMD_PORT =3D 0x04, + APPLESMC_ERR_PORT =3D 0x1e, APPLESMC_NUM_PORTS =3D 0x20, }; =20 @@ -53,6 +54,24 @@ enum { APPLESMC_GET_KEY_TYPE_CMD =3D 0x13, }; =20 +enum { + APPLESMC_ST_CMD_DONE =3D 0x00, + APPLESMC_ST_DATA_READY =3D 0x01, + APPLESMC_ST_BUSY =3D 0x02, + APPLESMC_ST_ACK =3D 0x04, + APPLESMC_ST_NEW_CMD =3D 0x08, +}; + +enum { + APPLESMC_ST_1E_CMD_INTRUPTED =3D 0x80, + APPLESMC_ST_1E_STILL_BAD_CMD =3D 0x81, + APPLESMC_ST_1E_BAD_CMD =3D 0x82, + APPLESMC_ST_1E_NOEXIST =3D 0x84, + APPLESMC_ST_1E_WRITEONLY =3D 0x85, + APPLESMC_ST_1E_READONLY =3D 0x86, + APPLESMC_ST_1E_BAD_INDEX =3D 0xb8, +}; + #ifdef DEBUG_SMC #define smc_debug(...) fprintf(stderr, "AppleSMC: " __VA_ARGS__) #else @@ -77,9 +96,12 @@ struct AppleSMCState { =20 MemoryRegion io_data; MemoryRegion io_cmd; + MemoryRegion io_err; uint32_t iobase; uint8_t cmd; uint8_t status; + uint8_t status_1e; + uint8_t last_ret; char key[4]; uint8_t read_pos; uint8_t data_len; @@ -93,89 +115,138 @@ static void applesmc_io_cmd_write(void *opaque, hwadd= r addr, uint64_t val, unsigned size) { AppleSMCState *s =3D opaque; + uint8_t status =3D s->status & 0x0f; =20 - smc_debug("CMD Write B: %#x =3D %#x\n", addr, val); + smc_debug("CMD received: 0x%02x\n", (uint8_t)val); switch (val) { case APPLESMC_READ_CMD: - s->status =3D 0x0c; + /* did last command run through OK? */ + if (status =3D=3D APPLESMC_ST_CMD_DONE || status =3D=3D APPLESMC_S= T_NEW_CMD) { + s->cmd =3D val; + s->status =3D APPLESMC_ST_NEW_CMD | APPLESMC_ST_ACK; + } else { + smc_debug("ERROR: previous command interrupted!\n"); + s->status =3D APPLESMC_ST_NEW_CMD; + s->status_1e =3D APPLESMC_ST_1E_CMD_INTRUPTED; + } break; + default: + smc_debug("UNEXPECTED CMD 0x%02x\n", (uint8_t)val); + s->status =3D APPLESMC_ST_NEW_CMD; + s->status_1e =3D APPLESMC_ST_1E_BAD_CMD; } - s->cmd =3D val; s->read_pos =3D 0; s->data_pos =3D 0; } =20 -static void applesmc_fill_data(AppleSMCState *s) +static struct AppleSMCData *applesmc_find_key(AppleSMCState *s) { struct AppleSMCData *d; =20 QLIST_FOREACH(d, &s->data_def, node) { if (!memcmp(d->key, s->key, 4)) { - smc_debug("Key matched (%s Len=3D%d Data=3D%s)\n", d->key, - d->len, d->data); - memcpy(s->data, d->data, d->len); - return; + return d; } } + return NULL; } =20 static void applesmc_io_data_write(void *opaque, hwaddr addr, uint64_t val, unsigned size) { AppleSMCState *s =3D opaque; + struct AppleSMCData *d; =20 - smc_debug("DATA Write B: %#x =3D %#x\n", addr, val); + smc_debug("DATA received: 0x%02x\n", (uint8_t)val); switch (s->cmd) { case APPLESMC_READ_CMD: + if ((s->status & 0x0f) =3D=3D APPLESMC_ST_CMD_DONE) { + break; + } if (s->read_pos < 4) { s->key[s->read_pos] =3D val; - s->status =3D 0x04; + s->status =3D APPLESMC_ST_ACK; } else if (s->read_pos =3D=3D 4) { - s->data_len =3D val; - s->status =3D 0x05; - s->data_pos =3D 0; - smc_debug("Key =3D %c%c%c%c Len =3D %d\n", s->key[0], - s->key[1], s->key[2], s->key[3], val); - applesmc_fill_data(s); + d =3D applesmc_find_key(s); + if (d !=3D NULL) { + memcpy(s->data, d->data, d->len); + s->data_len =3D d->len; + s->data_pos =3D 0; + s->status =3D APPLESMC_ST_ACK | APPLESMC_ST_DATA_READY; + s->status_1e =3D APPLESMC_ST_CMD_DONE; /* clear on valid = key */ + } else { + smc_debug("READ_CMD: key '%c%c%c%c' not found!\n", + s->key[0], s->key[1], s->key[2], s->key[3]); + s->status =3D APPLESMC_ST_CMD_DONE; + s->status_1e =3D APPLESMC_ST_1E_NOEXIST; + } } s->read_pos++; break; + default: + s->status =3D APPLESMC_ST_CMD_DONE; + s->status_1e =3D APPLESMC_ST_1E_STILL_BAD_CMD; } } =20 +static void applesmc_io_err_write(void *opaque, hwaddr addr, uint64_t val, + unsigned size) +{ + smc_debug("ERR_CODE received: 0x%02x, ignoring!\n", (uint8_t)val); + /* NOTE: writing to the error port not supported! */ +} + static uint64_t applesmc_io_data_read(void *opaque, hwaddr addr, unsigned = size) { AppleSMCState *s =3D opaque; - uint8_t retval =3D 0; =20 switch (s->cmd) { case APPLESMC_READ_CMD: + if (!(s->status & APPLESMC_ST_DATA_READY)) { + break; + } if (s->data_pos < s->data_len) { - retval =3D s->data[s->data_pos]; - smc_debug("READ_DATA[%d] =3D %#hhx\n", s->data_pos, - retval); + s->last_ret =3D s->data[s->data_pos]; + smc_debug("READ '%c%c%c%c'[%d] =3D %02x\n", + s->key[0], s->key[1], s->key[2], s->key[3], + s->data_pos, s->last_ret); s->data_pos++; if (s->data_pos =3D=3D s->data_len) { - s->status =3D 0x00; - smc_debug("EOF\n"); + s->status =3D APPLESMC_ST_CMD_DONE; + smc_debug("READ '%c%c%c%c' Len=3D%d complete!\n", + s->key[0], s->key[1], s->key[2], s->key[3], + s->data_len); } else { - s->status =3D 0x05; + s->status =3D APPLESMC_ST_ACK | APPLESMC_ST_DATA_READY; } } + break; + default: + s->status =3D APPLESMC_ST_CMD_DONE; + s->status_1e =3D APPLESMC_ST_1E_STILL_BAD_CMD; } - smc_debug("DATA Read b: %#x =3D %#x\n", addr, retval); + smc_debug("DATA sent: 0x%02x\n", s->last_ret); =20 - return retval; + return s->last_ret; } =20 static uint64_t applesmc_io_cmd_read(void *opaque, hwaddr addr, unsigned s= ize) { AppleSMCState *s =3D opaque; =20 - smc_debug("CMD Read B: %#x\n", addr); + smc_debug("CMD sent: 0x%02x\n", s->status); return s->status; } =20 +static uint64_t applesmc_io_err_read(void *opaque, hwaddr addr, unsigned s= ize) +{ + AppleSMCState *s =3D opaque; + + /* NOTE: read does not clear the 1e status */ + smc_debug("ERR_CODE sent: 0x%02x\n", s->status_1e); + return s->status_1e; +} + static void applesmc_add_key(AppleSMCState *s, const char *key, int len, const char *data) { @@ -198,6 +269,9 @@ static void qdev_applesmc_isa_reset(DeviceState *dev) QLIST_FOREACH_SAFE(d, &s->data_def, node, next) { QLIST_REMOVE(d, node); } + s->status =3D 0x00; + s->status_1e =3D 0x00; + s->last_ret =3D 0x00; =20 applesmc_add_key(s, "REV ", 6, "\x01\x13\x0f\x00\x00\x03"); applesmc_add_key(s, "OSK0", 32, s->osk); @@ -227,6 +301,16 @@ static const MemoryRegionOps applesmc_cmd_io_ops =3D { }, }; =20 +static const MemoryRegionOps applesmc_err_io_ops =3D { + .write =3D applesmc_io_err_write, + .read =3D applesmc_io_err_read, + .endianness =3D DEVICE_NATIVE_ENDIAN, + .impl =3D { + .min_access_size =3D 1, + .max_access_size =3D 1, + }, +}; + static void applesmc_isa_realize(DeviceState *dev, Error **errp) { AppleSMCState *s =3D APPLE_SMC(dev); @@ -241,6 +325,11 @@ static void applesmc_isa_realize(DeviceState *dev, Err= or **errp) isa_register_ioport(&s->parent_obj, &s->io_cmd, s->iobase + APPLESMC_CMD_PORT); =20 + memory_region_init_io(&s->io_err, OBJECT(s), &applesmc_err_io_ops, s, + "applesmc-err", 1); + isa_register_ioport(&s->parent_obj, &s->io_err, + s->iobase + APPLESMC_ERR_PORT); + if (!s->osk || (strlen(s->osk) !=3D 64)) { fprintf(stderr, "WARNING: Using AppleSMC with invalid key\n"); s->osk =3D default_osk; --=20 2.7.4 From nobody Mon Apr 29 21:30:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1491325376816605.7854353801656; Tue, 4 Apr 2017 10:02:56 -0700 (PDT) Received: from localhost ([::1]:36799 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cvRr5-0005EL-Mb for importer@patchew.org; Tue, 04 Apr 2017 13:02:55 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36857) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cvRpV-0003xv-P7 for qemu-devel@nongnu.org; Tue, 04 Apr 2017 13:01:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cvRpU-00030e-Td for qemu-devel@nongnu.org; Tue, 04 Apr 2017 13:01:17 -0400 Received: from mail-qk0-x241.google.com ([2607:f8b0:400d:c09::241]:36396) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cvRpU-00030L-QS for qemu-devel@nongnu.org; Tue, 04 Apr 2017 13:01:16 -0400 Received: by mail-qk0-x241.google.com with SMTP id v75so4257767qkb.3 for ; Tue, 04 Apr 2017 10:01:16 -0700 (PDT) Received: from HEDWIG.ini.cmu.edu (HEDWIG.INI.CMU.EDU. [128.2.16.51]) by smtp.gmail.com with ESMTPSA id z196sm12239899qkb.42.2017.04.04.10.01.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 04 Apr 2017 10:01:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=fA2UsosnlOp8U1SzbVpCo+1RdWLhYMDKlpFnYFGyuKo=; b=bRkSt/82Liu00fpcHTnqd+3fhCJ4ygFnLyZR0G51duE79LHpTrakeG5jpTTzvZggx7 aQ4huQontmJ1b/nI2mnI7kWxCd/+Xdo23hyBDNoayVj96xjKYoh4uJzCgHnTycT3VTnO Q92ARKSI4pOFduWzVP3qlpilHzZ8McQKBatBjBknB77ebMslFE/rHxfSAOreuj/UTqCZ qmhX2VMhDkA3vrEMPwQuNrwSp5VKGJf9ufbzd/1dU2lDOHJkRtnJA4I/BNO3VYQ//PHf sfuLSIfI3351/60NzBk3kma8sxzeddpHaWCUpc+5SywCUr8E1OQCW93w2bOzmi8w/pxD d8Ig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=fA2UsosnlOp8U1SzbVpCo+1RdWLhYMDKlpFnYFGyuKo=; b=hNZF7iddq5XZmaEyyCZCIhG20yVedITewJwRQIIX0mKBNFMAUwbNBvQjFuuEG9GWCk wNptRYFbjwCWhu6o4dn4a7ZAR6yYB6lXbcJQgYNzb6vpuSVQAa4XyvbKQfJqDnKk9juO v3ZtF5IKs6oYHCB8Z9K7a7wVMNwHag38m7cx7DoDH/2ZtwWxdwTXDShS1r0B/8Mts2aX 0BO32FvFg1ocz54BPXdz3IzWnVLw2JxGVOPLEbnSPU63BcEZSbm2noVuxTfvK0EhyCII 6wZHYFkbrDJe692RuR1vaHVhftgLbMbqQqy7uGDM9GNZxPyu5Xyqhl4lII0JNB1V6v6f 1NqA== X-Gm-Message-State: AN3rC/5y9pXdao5oy7VqSc5icTU5YYVouv7rZn7UuEufhXZxyk4toa8RdkBCEjLBpUzThw== X-Received: by 10.55.12.213 with SMTP id 204mr6230065qkm.233.1491325276063; Tue, 04 Apr 2017 10:01:16 -0700 (PDT) From: "Gabriel L. Somlo" To: qemu-devel@nongnu.org Date: Tue, 4 Apr 2017 13:01:04 -0400 Message-Id: <1491325264-14502-4-git-send-email-gsomlo@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1491325264-14502-1-git-send-email-gsomlo@gmail.com> References: <1491325264-14502-1-git-send-email-gsomlo@gmail.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2607:f8b0:400d:c09::241 Subject: [Qemu-devel] [PATCH v2 3/3] applesmc: fix port i/o access width X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pbonzini@redhat.com, eshelton@pobox.com, f4bug@amsat.org, agraf@suse.de Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Set width of the two i/o regions dedicated to the AppleSMC's 8-bit data and command ports to 1 byte. Signed-off-by: Gabriel Somlo Reviewed-by: Alexander Graf --- Setting these to 1-byte width works fine on any OS X version I could find to test on: 10.(6-12), inclusive. On linux, the applesmc kernel module tries *hard* to avoid loading on anything that's not a Mac, by checking DMI board vendor and product strings. If I force it using: -smbios type=3D1,manufacturer=3D'Apple Inc.',product=3D'iMac2',family=3D= 'iMac' \ -smbios type=3D2,manufacturer=3D'Apple Inc.',version=3D'iMac' \ -device isa-applesmc the module fails both before and after this whole series, suggesting it's not (just) the access width but rather the overall incomplete emulation that's the issue. If we decide to go for implementing a more complete emulation, beyond simply the minimum necessary to satisfy OS X, we should definitely ensure that Linux is also happily able to initialize its applesmc driver... hw/misc/applesmc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/misc/applesmc.c b/hw/misc/applesmc.c index 0d882e8..7896812 100644 --- a/hw/misc/applesmc.c +++ b/hw/misc/applesmc.c @@ -316,12 +316,12 @@ static void applesmc_isa_realize(DeviceState *dev, Er= ror **errp) AppleSMCState *s =3D APPLE_SMC(dev); =20 memory_region_init_io(&s->io_data, OBJECT(s), &applesmc_data_io_ops, s, - "applesmc-data", 4); + "applesmc-data", 1); isa_register_ioport(&s->parent_obj, &s->io_data, s->iobase + APPLESMC_DATA_PORT); =20 memory_region_init_io(&s->io_cmd, OBJECT(s), &applesmc_cmd_io_ops, s, - "applesmc-cmd", 4); + "applesmc-cmd", 1); isa_register_ioport(&s->parent_obj, &s->io_cmd, s->iobase + APPLESMC_CMD_PORT); =20 --=20 2.7.4