git: 9front

Download patch

ref: 1913f4f87c592cae5290a56c5bbc0602984bf7bc
parent: 2f7a025a3bd1490e600828619a4fb1c24e4b4bb9
parent: b8712d46198c5ccd373e421aaeb281b35ec8c73a
author: cinap_lenrek <cinap_lenrek@localhost>
date: Wed May 18 15:58:00 EDT 2011

merge

--- a/sys/src/9/pc/mp.c
+++ b/sys/src/9/pc/mp.c
@@ -883,13 +883,14 @@
 enum {
 	MSICtrl = 0x02, /* message control register (16 bit) */
 	MSIAddr = 0x04, /* message address register (64 bit) */
-	MSIData = 0x0C, /* message data register (16 bit) */
+	MSIData32 = 0x08, /* message data register for 32 bit MSI (16 bit) */
+	MSIData64 = 0x0C, /* message data register for 64 bit MSI (16 bit) */
 };
 
 static int
 msiintrenable(Vctl *v)
 {
-	int tbdf, vno, cap, cpu;
+	int tbdf, vno, cap, cpu, ok64;
 	Pcidev *pci;
 
 	if(getconf("*msi") == nil)
@@ -913,9 +914,10 @@
 	
 	vno = allocvector();
 	cpu = mpintrcpu();
+	ok64 = (pcicfgr16(pci, cap + MSICtrl) & (1<<7)) != 0;
 	pcicfgw32(pci, cap + MSIAddr, (0xFEE << 20) | (cpu << 12));
-	pcicfgw32(pci, cap + MSIAddr + 4, 0);
-	pcicfgw16(pci, cap + MSIData, vno | (1<<14));
+	if(ok64) pcicfgw32(pci, cap + MSIAddr + 4, 0);
+	pcicfgw16(pci, cap + (ok64 ? MSIData64 : MSIData32), vno | (1<<14));
 	pcicfgw16(pci, cap + MSICtrl, 1);
 	print("msiintrenable: success with tbdf %.8x, vector %d, cpu %d\n", tbdf, vno, cpu);
 	v->isr = lapicisr;
--- /dev/null
+++ b/sys/src/cmd/tput.c
@@ -1,0 +1,42 @@
+#include <u.h>
+#include <libc.h>
+
+enum {buflen = 4096};
+
+void
+main(int argc, char **argv)
+{
+	int rc, cpid, fd, dopipe;
+	static char buf[buflen];
+	static uvlong bc, sec;
+	double speed;
+	
+	dopipe = 0;
+	ARGBEGIN {
+	case 'p': dopipe = 1;
+	} ARGEND
+	
+	bc = 0;
+	sec = 0;
+	cpid = rfork(RFPROC | RFMEM);
+	if(cpid == 0) {
+		while(1) {
+			sleep(1000);
+			speed = bc / ++sec;
+			if(speed >= 1073741824) fprint(2, "%.2f GB/s\n", speed / 1073741824);
+			else if(speed >= 1048576) fprint(2, "%.2f MB/s\n", speed / 1048576);
+			else if(speed >= 1024) fprint(2, "%.2f KB/s\n", speed / 1024);
+			else fprint(2, "%.2f B/s\n", speed);
+		}
+	}
+	while(1) {
+		rc = read(0, buf, buflen);
+		if(rc <= 0) break;
+		if(dopipe) write(1, buf, rc);
+		bc += rc;
+	}
+	sprint(buf, "/proc/%d/note", cpid);
+	fd = open(buf, OWRITE);
+	write(fd, "kill", 4);
+	if(rc < 0) sysfatal("%r");
+}
--