From patchwork Mon Mar 5 03:09:08 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Wang X-Patchwork-Id: 144583 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 90BC4B6F98 for ; Mon, 5 Mar 2012 14:44:11 +1100 (EST) Received: from localhost ([::1]:45621 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S4OqH-0003OF-BR for incoming@patchwork.ozlabs.org; Sun, 04 Mar 2012 22:44:09 -0500 Received: from eggs.gnu.org ([208.118.235.92]:45653) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S4OIe-0007it-NK for qemu-devel@nongnu.org; Sun, 04 Mar 2012 22:09:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1S4OIc-0004CO-SQ for qemu-devel@nongnu.org; Sun, 04 Mar 2012 22:09:24 -0500 Received: from mx1.redhat.com ([209.132.183.28]:33507) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S4OIc-0004CF-Km for qemu-devel@nongnu.org; Sun, 04 Mar 2012 22:09:22 -0500 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q2539BZt026922 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sun, 4 Mar 2012 22:09:11 -0500 Received: from [127.0.1.1] (dhcp-65-172.nay.redhat.com [10.66.65.172]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q25399FY010725; Sun, 4 Mar 2012 22:09:09 -0500 To: aliguori@us.ibm.com, stefanha@linux.vnet.ibm.com, mst@redhat.com, qemu-devel@nongnu.org, benjamin.poirier@gmail.com, aurelien@aurel32.net From: Jason Wang Date: Mon, 05 Mar 2012 11:09:08 +0800 Message-ID: <20120305030908.8515.57688.stgit@jason-ThinkPad-T400> In-Reply-To: <20120305030824.8515.53602.stgit@jason-ThinkPad-T400> References: <20120305030824.8515.53602.stgit@jason-ThinkPad-T400> User-Agent: StGit/0.15 MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.132.183.28 X-Mailman-Approved-At: Sun, 04 Mar 2012 22:43:47 -0500 Subject: [Qemu-devel] [PATCH 6/6] rtl8139: do the network/host communication only in normal operating mode X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org According the spec, the card works in network/host communication mode only when both EEM1 and EEM0 are unset in 93C46 Command Register (normal op mode). So this patch check these bits before trying to receive packets. As some guest driver (such as linux, see cp_init_hw() in 8139cp.c) allocate rx ring after the recevier were enabled, this would cause our emulation codes tries to dma into guest memory when the rx descriptor is not properly configured. This patch fixes this. Signed-off-by: Jason Wang --- hw/rtl8139.c | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) diff --git a/hw/rtl8139.c b/hw/rtl8139.c index 2e3da0b..97a4b77 100644 --- a/hw/rtl8139.c +++ b/hw/rtl8139.c @@ -791,6 +791,9 @@ static int rtl8139_can_receive(VLANClientState *nc) return 1; if (!rtl8139_receiver_enabled(s)) return 1; + /* network/host communication happens only in normal mode */ + if ((s->Cfg9346 & Chip9346_op_mask) != Cfg9346_Normal) + return 0; if (rtl8139_cp_receiver_enabled(s)) { /* ??? Flow control not implemented in c+ mode. @@ -833,6 +836,12 @@ static ssize_t rtl8139_do_receive(VLANClientState *nc, const uint8_t *buf, size_ return -1; } + /* check whether we are in normal mode */ + if ((s->Cfg9346 & Chip9346_op_mask) != Cfg9346_Normal) { + DPRINTF("not in normal op mode\n"); + return -1; + } + /* XXX: check this */ if (s->RxConfig & AcceptAllPhys) { /* promiscuous: receive all */