From owner-FreeBSD-tech-jp@jp.freebsd.org  Sun Sep 19 04:53:46 1999
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id EAA77421;
	Sun, 19 Sep 1999 04:53:46 +0900 (JST)
	(envelope-from owner-FreeBSD-tech-jp@jp.FreeBSD.org)
Received: from light.imasy.or.jp (root@light.imasy.or.jp [202.227.24.4])
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) with ESMTP id EAA77416
	for <FreeBSD-tech-jp@jp.freebsd.org>; Sun, 19 Sep 1999 04:53:44 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
Received: from tasogare.imasy.or.jp (daemon@tasogare.imasy.or.jp [202.227.24.5])
	by light.imasy.or.jp (8.9.3+3.2W/3.7W-light) with ESMTP id EAA14805
	for <FreeBSD-tech-jp@jp.freebsd.org>; Sun, 19 Sep 1999 04:53:43 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
Received: from localhost (isdnb62.imasy.or.jp [202.227.24.190])
	by tasogare.imasy.or.jp (8.9.3+3.2W/3.7W-tasogare/smtpfeed 1.01) with ESMTP id EAA12879
	for <FreeBSD-tech-jp@jp.freebsd.org>; Sun, 19 Sep 1999 04:53:41 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
Message-Id: <199909181953.EAA12879@tasogare.imasy.or.jp>
To: FreeBSD-tech-jp@jp.freebsd.org
X-Mailer: Mew version 1.93 on Emacs 19.34 / Mule 2.3 (SUETSUMUHANA)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
Date: Sun, 19 Sep 1999 04:56:37 +0900
From: Mitsuru IWASAKI <iwasaki@jp.freebsd.org>
X-Dispatcher: imput version 980905(IM100)
Lines: 285
Reply-To: FreeBSD-tech-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+990727
X-Sequence: FreeBSD-tech-jp 2520
Subject: [FreeBSD-tech-jp 2520] FreeBSD ACPI support?
Errors-To: owner-FreeBSD-tech-jp@jp.freebsd.org
Sender: owner-FreeBSD-tech-jp@jp.freebsd.org
X-Originator: iwasaki@jp.freebsd.org

$B$$$o$5$-$H?=$7$^$9(B

$B@h$[$I$=$m$=$m(B ACPI $B$r$H;W$$N)$A!"5,3J=q$r$J$J$aFI$_$7$J$,$i(B
$B=i4|2=ItJ,$N%3!<%I$r$A$g$3$C$H=q$$$F$_$^$7$?!#$H$j$"$($:(B
- System Address Map $B$+$i(B ACPI Reclaim Memory $B$H(B ACPI NVS Memory $B$N(B
  address range descriptor $B$r$D$+$^$($k(B
- BIOS $B$N%a%b%j$+$i(B ACPI $B$N(B signature $B$r$5$,$7$F(B Root System 
  Description Pointer (RSD PTR) $B$H(B Root System Description Table 
  (RSDT) $B$r$D$+$^$($k(B
$B$NFs$D$,$G$-$F$$$^$9!#(B
# ACPI Reclaim Memory $B$H(B RSDT $B$N%"%I%l%9$,0lCW$7$F$$$k$3$H$K(B
# $BL/$KG<F@$7$F$^$9(B (^^;

$B$3$N$"$H(B RSDT $B$r$?$I$C$F(B Fixed ACPI Description Table $B$r$5$,$7!"(B
SMI $B%3%^%s%I%]!<%H$K(B ACPI_ENABLE $B$NCM$r=q$-9~$`$H$3$m$^$G$r(B
$BL\I8$H$7$F$^$9$,!"L2$/$J$C$?$N$H(B RSDT $B$NCM$,(B physical address 
$B$NJQ$J>l=j$K$"$k$N$GLLE]$/$5$/$J$C$?$N$GCfCG$7$F$$$^$9!#(B
$B$I$J$?$+6=L#$N$"$k?M!"0l=o$K:n6H$7$^$;$s$+(B?
$B@-JL!"G/NpEy!"@)8B$OFC$K$"$j$^$;$s(B :-)
$B$^$?!"(BNetBSD $B$d(B Linux $B$G$N>pJs$r$*;}$A$NJ}!"$J$K$+65$($F$/$@$5$$$^$;!#(B

$B0J2<!"(Bchandra2 $B$G$N(B dmesg $B=PNO$G$9!#(B

Copyright (c) 1992-1999 FreeBSD Inc.
Copyright (c) 1982, 1986, 1989, 1991, 1993
	The Regents of the University of California. All rights reserved.
FreeBSD 3.3-STABLE #1: Sun Sep 19 02:56:20 JST 1999
    root@localhost:/usr/src-3.3/sys/compile/CHANDRA2
Timecounter "i8254"  frequency 1193182 Hz
CPU: Pentium/P55C (quarter-micron) (262.39-MHz 586-class CPU)
  Origin = "GenuineIntel"  Id = 0x582  Stepping = 2
  Features=0x8001bf<FPU,VME,DE,PSE,TSC,MSR,MCE,CX8,MMX>
real memory  = 134217728 (131072K bytes)
avail memory = 127074304 (124096K bytes)
ACPI: Found ACPI BIOS data at 0xc00fe1d0 (  RIOS, RSDT@7ffe2c0)
SMAP: BASE [00000000 00000000] - 00000000 0009fc00 : Address Range Memory
SMAP: BASE [00000000 0009fc00] - 00000000 00000400 : Address Range Reserved
SMAP: BASE [00000000 000f0000] - 00000000 00010000 : Address Range Reserved
SMAP: BASE [00000000 00100000] - 00000000 07efe2c0 : Address Range Memory
SMAP: BASE [00000000 07ffe2c0] - 00000000 00001d00 : ACPI Reclaim Memory
SMAP: BASE [00000000 07ffffc0] - 00000000 00000040 : ACPI NVS Memory
SMAP: BASE [00000000 fffe0000] - 00000000 00020000 : Address Range Reserved
Probing for devices on PCI bus 0:

$B0J2<!"(B3.3-RELEASE $B$KBP$9$k:9J,$G$9!#(B
$BEOJU!w?@8MBg$5$s$N(B userland $B$N%D!<%k$r;29M$K$7$^$7$?!#(B
$B>e5-%D!<%k$H(B ACPI $B$N5,3J=q$N(B URL $B$O<:G0$7$^$7$?$,!"(B
$B$-$C$HC/$+$,65$($F$/$l$k$G$7$g$&(B (^^;

Index: i386/i386/bios.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/i386/bios.c,v
retrieving revision 1.11.2.2
diff -u -r1.11.2.2 bios.c
--- bios.c	1999/08/29 16:05:35	1.11.2.2
+++ bios.c	1999/09/18 18:13:55
@@ -30,6 +30,7 @@
  * Code for dealing with the BIOS in x86 PC systems.
  */
 
+#include "opt_vm86.h"
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/kernel.h>
@@ -54,6 +55,28 @@
 /* start fairly early */
 SYSINIT(bios32, SI_SUB_CPU, SI_ORDER_ANY, bios32_init, NULL);
 
+struct ACPIrsdp {
+  u_char	signature[8];
+  u_char	sum;
+  u_char	oem[6];
+  u_char	res;
+  u_int32_t	addr;
+};
+
+struct ACPIsdt {
+  u_char	signature[4];
+  u_int32_t	len;
+  u_char	rev;
+  u_char	check;
+  u_char	oemid[6];
+  u_char	oemtblid[8];
+  u_char	oemrev[4];
+  u_char	creator[4];
+  u_char	crerev[4];
+#define SIZEOF_SDT_HDR 36 /*struct size except body*/
+  u_int32_t	body;
+};
+
 /*
  * bios32_init
  *
@@ -66,14 +89,18 @@
     struct bios32_SDheader	*sdh;
     struct SMBIOS_table		*sbt;
     struct DMI_table		*dmit;
+    struct ACPIrsdp		*rsdp;
+    struct ACPIsdt		*rsdt;
+#ifdef VM86
+    struct SMAP_addr_range_desc	*ard_entry;
+#endif
     u_int8_t			ck, *cv;
     int				i;
-    
 
     /*
      * BIOS32 Service Directory
      */
-    
+
     /* look for the signature */
     if ((sigaddr = bios_sigsearch(0, "_32_", 4, 16, 0)) != 0) {
 
@@ -150,10 +177,60 @@
 	    printf("Bad DMI table checksum!\n");
 	}
     }
+
+    /*
+     * ACPI BIOS
+     */
+    if ((sigaddr = bios_sigsearch(0, "RSD PTR ", 8, 16, 0)) != 0) {
+	/* get a virtual pointer to the structure */
+	rsdp = (struct ACPIrsdp *)(uintptr_t)BIOS_PADDRTOVADDR(sigaddr);
+	for (cv = (u_int8_t *)rsdp, ck = 0, i = 0; i < sizeof(struct ACPIrsdp); i++) {
+	    ck += cv[i];
+	}
+
+	/* If checksum is OK, enable it */
+	if (ck == 0) {
+	    printf("ACPI: Found ACPI BIOS data at %p (%6s, RSDT@%x)\n",
+		rsdp, rsdp->oem, rsdp->addr);
+#if 0
+	    /* How to access to rsdt? */
+	    rsdt = (struct ACPIsdt *)(uintptr_t)BIOS_PADDRTOVADDR(rsdp->addr);
+#endif
+       } else {
+           printf("ACPI: Bad ACPI BIOS data checksum\n");
+       }
+    }
+
+#ifdef VM86
+    for (ard_entry = STAILQ_FIRST(&SMAP_table);
+	 ard_entry != NULL;
+	 ard_entry = STAILQ_NEXT(ard_entry, links)) {
+	printf("SMAP: BASE [%08x %08x] - %08x %08x : ",
+		ard_entry->base_high, ard_entry->base_low,
+		ard_entry->length_high, ard_entry->length_low);
+	switch (ard_entry->type) {
+	case 1:
+		printf("Address Range Memory\n");
+		break;
+	case 2:
+		printf("Address Range Reserved\n");
+		break;
+	case 3:
+		printf("ACPI Reclaim Memory\n");
+		break;
+	case 4:
+		printf("ACPI NVS Memory\n");
+		break;
+	default:
+		printf("Undefined\n");
+	}
+    }
+#endif
+
     if (bootverbose) {
 	    /* look for other know signatures */
 	    printf("Other BIOS signatures found:\n");
-	    printf("ACPI: %08x\n", bios_sigsearch(0, "RST PTR", 8, 16, 0));
+	    printf("ACPI: %08x\n", bios_sigsearch(0, "RSD PTR ", 8, 16, 0));
 	    printf("$PnP: %08x\n", bios_sigsearch(0, "$PnP", 4, 16, 0));
     }
 }
Index: i386/i386/vm86.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/i386/vm86.c,v
retrieving revision 1.19.2.3
diff -u -r1.19.2.3 vm86.c
--- vm86.c	1999/08/29 16:05:57	1.19.2.3
+++ vm86.c	1999/09/18 16:40:43
@@ -47,6 +47,7 @@
 #include <machine/pcb_ext.h>	/* pcb.h included via sys/user.h */
 #include <machine/psl.h>
 #include <machine/specialreg.h>
+#include <machine/pc/bios.h>
 
 extern int i386_extend_pcb	__P((struct proc *));
 extern struct segment_descriptor common_tssd;
@@ -487,6 +488,17 @@
 	panic("vm86_addpage: not enough room, or overlap");
 }
 
+/* XXX
+ * We cannot use malloc() here, so allocate space statically.
+ */
+#ifndef	SMAP_TABLE_MAX_SIZE
+#define	SMAP_TABLE_MAX_SIZE	16
+#endif
+static struct SMAP_addr_range_desc SMAP_ard_table[SMAP_TABLE_MAX_SIZE];
+static u_int  SMAP_ard_table_size = 0;
+
+struct SMAP_table SMAP_table;
+
 void
 initial_bioscalls(u_int *basemem, u_int *extmem)
 {
@@ -500,6 +512,7 @@
 		u_int64_t length;
 		u_int32_t type;
 	} *smap;
+	struct SMAP_addr_range_desc *addr_range_desc, *ard_entry;
 
 	bzero(&vmf, sizeof(struct vm86frame));		/* safety */
 	vm86_initialize();
@@ -530,6 +543,9 @@
 #define SMAPSIZ 	sizeof(*smap)
 #define SMAP_SIG	0x534D4150			/* 'SMAP' */
 
+	STAILQ_INIT(&SMAP_table);
+	SMAP_ard_table_size = 0;
+
 	vmc.npages = 0;
 	smap = (void *)vm86_addpage(&vmc, 1, KERNBASE + (1 << PAGE_SHIFT));
 	vm86_getptr(&vmc, (vm_offset_t)smap, &vmf.vmf_es, &vmf.vmf_di);
@@ -546,6 +562,22 @@
 			*extmem += (smap->length / 1024);
 			highwat = smap->base + smap->length;
 		}
+		if (vmf.vmf_ecx < 20 || vmf.vmf_ecx > SMAPSIZ) {
+			printf("SMAP: wrong buffer size, bug in BIOS!\n");
+			continue;
+		}
+		addr_range_desc = (void *)MAKE_ADDR(vmf.vmf_es, vmf.vmf_di);
+		if (SMAP_ard_table_size == SMAP_TABLE_MAX_SIZE) {
+			printf("SMAP: no enough room, increase SMAP_TABLE_MAX_SIZE\n");
+			continue;
+		}
+		ard_entry = &SMAP_ard_table[SMAP_ard_table_size++];
+		ard_entry->base_low    = addr_range_desc->base_low;
+		ard_entry->base_high   = addr_range_desc->base_high;
+		ard_entry->length_low  = addr_range_desc->length_low;
+		ard_entry->length_high = addr_range_desc->length_high;
+		ard_entry->type        = addr_range_desc->type;
+		STAILQ_INSERT_TAIL(&SMAP_table, ard_entry, links);
 	} while (vmf.vmf_ebx != 0);
 
 	if (*extmem != 0) {
Index: i386/include/pc/bios.h
===================================================================
RCS file: /home/ncvs/src/sys/i386/include/pc/bios.h,v
retrieving revision 1.2.2.1
diff -u -r1.2.2.1 bios.h
--- bios.h	1999/08/29 16:07:04	1.2.2.1
+++ bios.h	1999/09/18 16:41:08
@@ -100,6 +100,19 @@
     struct DMI_table dmi;		/* follows immediately */
 };
 
+/*
+ * SMAP Address Range Descriptor / System Address Map by INT 15H, E820H
+ */
+struct SMAP_addr_range_desc {
+	u_int32_t base_low;
+	u_int32_t base_high;
+	u_int32_t length_low;
+	u_int32_t length_high;
+	u_int32_t type;
+	STAILQ_ENTRY(SMAP_addr_range_desc) links;
+};
+
+STAILQ_HEAD(SMAP_table, SMAP_addr_range_desc);
 
 /* 
  * Exported lookup results 
@@ -107,6 +120,7 @@
 extern struct bios32_SDentry	PCIbios;
 extern struct SMBIOS_table	*SMBIOS_table;
 extern struct DMI_table		*DMI_table;
+extern struct SMAP_table	SMAP_table;
 
 
     
