From owner-freebsd-hackers@FreeBSD.ORG Mon Nov 24 07:18:48 2003 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 1037F16A4CE for ; Mon, 24 Nov 2003 07:18:48 -0800 (PST) Received: from mother.ludd.luth.se (mother.ludd.luth.se [130.240.16.3]) by mx1.FreeBSD.org (Postfix) with ESMTP id 238ED43F85 for ; Mon, 24 Nov 2003 07:18:46 -0800 (PST) (envelope-from pb@ludd.luth.se) Received: from brother.ludd.luth.se (daemon@brother.ludd.luth.se [130.240.16.78])hAOFIiDY004532 for ; Mon, 24 Nov 2003 16:18:44 +0100 (MET) From: Peter B Received: (from pb@localhost) by brother.ludd.luth.se (8.11.6+Sun/8.9.3) id hAOFIEl13682 for freebsd-hackers@freebsd.org; Mon, 24 Nov 2003 16:18:14 +0100 (MET) Message-Id: <200311241518.hAOFIEl13682@brother.ludd.luth.se> To: freebsd-hackers@freebsd.org Date: Mon, 24 Nov 2003 16:18:14 +0100 (MET) X-Mailer: ELM [version 2.4ME+ PL54 (25)] MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Subject: Going realmode in kernel drivers? X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 24 Nov 2003 15:18:48 -0000 i386/FreeBSD-4.x/lkm. How does one get into 'realmode' inside a kernel driver? The reason for the need is a tight timeing loop that measures the lenght of pulses. And disableing interrupts is just not enough. Target cpu's are AMD K5 + AMD XP. Asfair when reading cycles per opcode. The number of cycles required increase about three times when useing protected mode or similar. Code excerpt: u_int32_t register cnt1; u_int32_t register cnt_max=0xFF; u_int32_t register *store_ptr; u_int32_t register *store_end; u_int8_t register last_val=0; store_ptr = ..; store_end = ..+ SIZ; disable_intr(); for(;;) { for(cnt1=0; cnt1=store_end ) break; last_val ^= 0x20; } enable_intr(); (Will start on a new count every signal flank). /P