Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 24 May 2002 10:25:53 -0400 (EDT)
From:      John Baldwin <jhb@FreeBSD.org>
To:        current@FreeBSD.org
Subject:   Please test PAUSE on non-Intel processors
Message-ID:  <XFMail.20020524102553.jhb@FreeBSD.org>

next in thread | raw e-mail | index | archive | help
This message is in MIME format
--_=XFMail.1.5.2.FreeBSD:20020524102530:485=_
Content-Type: text/plain; charset=us-ascii

Hey gang, although Intel's document seems to claim that they tested
proper operation of pause I'd like people with non-Intel processors
to verify that it actually works.  Please compile the attached test
program and run it.  The output should look like this:

> ./pt
Testing PAUSE instruction:
Register esp changed: 0xbfbff9fc -> 0xbfbff9c0

If you get a signal or any of the other registers change their value,
please let me know.  I've tested this on a Pentium III mobile, a K6-II,
and an Athlon.  The program cmopiles ok on both stable and current.

-----FW: <200205212226.g4LMQaV68801@freefall.freebsd.org>-----

Date: Tue, 21 May 2002 15:26:36 -0700 (PDT)
Sender: owner-cvs-committers@FreeBSD.org
From: John Baldwin <jhb@FreeBSD.org>
To: cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org
Subject: cvs commit: src/sys/kern kern_mutex.c

jhb         2002/05/21 15:26:36 PDT

  Modified files:
    sys/kern             kern_mutex.c 
  Log:
  Add appropriate IA32 "pause" instructions to improve performanec on
  Pentium 4's and newer IA32 processors.  The "pause" instruction has been
  verified by Intel to be a NOP on all currently existing IA32 processors
  prior to the Pentium 4.
  
  Revision  Changes    Path
  1.95      +17 -1     src/sys/kern/kern_mutex.c

--------------End of forwarded message-------------------------

-- 

John Baldwin <jhb@FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve!"  -  http://www.FreeBSD.org/

--_=XFMail.1.5.2.FreeBSD:20020524102530:485=_
Content-Disposition: attachment; filename="pausetest.c"
Content-Transfer-Encoding: 7bit
Content-Description: pausetest.c
Content-Type: text/plain; charset=us-ascii; name=pausetest.c; SizeOnDisk=1607

/*
 * Simple program to see if the new IA32 PAUSE instruction works properly.
 * We test two different things: 1) that we don't get an illegal instruction
 * fault, and 2) that no registers change state.
 */

#include <sys/types.h>
#include <stdio.h>

#define	NUM_SEGREGS	6
#define	NUM_REGS	15

#define	PUSH_REGS			\
	"	pushf ;\n"		\
	"	pusha ;\n"		\
	"	push %cs ;\n"		\
	"	push %ds ;\n"		\
	"	push %es ;\n"		\
	"	push %fs ;\n"		\
	"	push %gs ;\n"		\
	"	push %ss ;\n"

const char *register_names[NUM_REGS] = {
	"ss", "gs", "fs", "es", "ds", "cs",
	"edi", "esi", "ebp", "esp", "ebx", "edx", "ecx", "eax",
	"eflags"
};

struct register_set {
	register_t	r_regs[NUM_REGS];
/*
	register_t	r_ss;
	register_t	r_gs;
	register_t	r_fs;
	register_t	r_es;
	register_t	r_ds;
	register_t	r_cs;
	register_t	r_edi;
	register_t	r_esi;
	register_t	r_ebp;
	register_t	r_isp;
	register_t	r_ebx;
	register_t	r_edx;
	register_t	r_ecx;
	register_t	r_eax;
	register_t	r_eflags;
 */
};

void
compare_registers(struct register_set after, struct register_set before)
{
	int i;

	for (i = 0; i < NUM_SEGREGS; i++) {
		before.r_regs[i] &= 0xffff;
		after.r_regs[i] &= 0xffff;
	}
	for (i = 0; i < NUM_REGS; i++)
		if (before.r_regs[i] != after.r_regs[i])
			printf("Register %s changed: %#x -> %#x\n",
			    register_names[i], before.r_regs[i],
			    after.r_regs[i]);
}

void
test_pause(void)
{
	__asm __volatile(
	"	mov $10,%ecx ;\n"
	PUSH_REGS
	"	pause ;\n"
	PUSH_REGS
	"	call compare_registers ;\n"
	"	addl $0x78,%esp ;\n");
}

int
main(int ac, char **av)
{

	printf("Testing PAUSE instruction:\n");
	test_pause();
	return (0);
}

--_=XFMail.1.5.2.FreeBSD:20020524102530:485=_--
End of MIME message

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?XFMail.20020524102553.jhb>