PERFORCE change 61786 for review

Marcel Moolenaar marcel at FreeBSD.org
Sat Sep 18 18:49:57 PDT 2004


http://perforce.freebsd.org/chv.cgi?CH=61786

Change 61786 by marcel at marcel_nfs on 2004/09/19 01:49:29

	Completely stop including Intel EFI headers. This comes from
	the marcel_ia64_pmap branch and has some functions that may
	not make sense right now.

Affected files ...

.. //depot/projects/ia64/sys/ia64/acpica/OsdEnvironment.c#10 edit
.. //depot/projects/ia64/sys/ia64/ia64/dump_machdep.c#6 edit
.. //depot/projects/ia64/sys/ia64/ia64/efi.c#6 edit
.. //depot/projects/ia64/sys/ia64/ia64/eficlock.c#3 edit
.. //depot/projects/ia64/sys/ia64/ia64/machdep.c#108 edit
.. //depot/projects/ia64/sys/ia64/ia64/sal.c#11 edit
.. //depot/projects/ia64/sys/ia64/include/efi.h#4 edit
.. //depot/projects/ia64/sys/ia64/include/sal.h#4 edit

Differences ...

==== //depot/projects/ia64/sys/ia64/acpica/OsdEnvironment.c#10 (text+ko) ====

@@ -23,58 +23,52 @@
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
- *
- *	$FreeBSD: src/sys/ia64/acpica/OsdEnvironment.c,v 1.7 2004/05/06 02:18:58 njl Exp $
  */
 
-/*
- * 6.1 : Environmental support
- */
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: src/sys/ia64/acpica/OsdEnvironment.c,v 1.7 2004/05/06 02:18:58 njl Exp $");
+
 #include <sys/types.h>
 #include <sys/linker_set.h>
 #include <sys/sysctl.h>
+#include <machine/efi.h>
 
 #include "acpi.h"
 
-extern u_int64_t ia64_efi_acpi_table;
-extern u_int64_t ia64_efi_acpi20_table;
+static struct uuid acpi_root_uuid = EFI_TABLE_ACPI20;
 
-static u_long ia64_acpi_root;
+static u_long acpi_root_phys;
 
-SYSCTL_ULONG(_machdep, OID_AUTO, acpi_root, CTLFLAG_RD, &ia64_acpi_root, 0,
-	     "The physical address of the RSDP");
+SYSCTL_ULONG(_machdep, OID_AUTO, acpi_root, CTLFLAG_RD, &acpi_root_phys, 0,
+    "The physical address of the RSDP");
 
 ACPI_STATUS
 AcpiOsInitialize(void)
 {
+
 	return(AE_OK);
 }
 
 ACPI_STATUS
 AcpiOsTerminate(void)
 {
+
 	return(AE_OK);
 }
 
 ACPI_STATUS
 AcpiOsGetRootPointer(UINT32 Flags, ACPI_POINTER *RsdpAddress)
 {
-	if (ia64_acpi_root == 0) {
-		if (ia64_efi_acpi20_table) {
-			/* XXX put under bootverbose. */
-			printf("Using ACPI2.0 table at 0x%lx\n",
-			       ia64_efi_acpi20_table);
-			ia64_acpi_root = ia64_efi_acpi20_table;
-		} else if (ia64_efi_acpi_table) {
-			/* XXX put under bootverbose. */
-			printf("Using ACPI1.x table at 0x%lx\n",
-			       ia64_efi_acpi_table);
-			ia64_acpi_root = ia64_efi_acpi_table;
-		} else
+	void *acpi_root;
+
+	if (acpi_root_phys == 0) {
+		acpi_root = efi_get_table(&acpi_root_uuid);
+		if (acpi_root == NULL)
 			return (AE_NOT_FOUND);
+		acpi_root_phys = IA64_RR_MASK((u_long)acpi_root);
 	}
 
 	RsdpAddress->PointerType = ACPI_PHYSICAL_POINTER;
-	RsdpAddress->Pointer.Physical = ia64_acpi_root;
+	RsdpAddress->Pointer.Physical = acpi_root_phys;
 	return (AE_OK);
 }

==== //depot/projects/ia64/sys/ia64/ia64/dump_machdep.c#6 (text+ko) ====

@@ -22,10 +22,11 @@
  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD: src/sys/ia64/ia64/dump_machdep.c,v 1.10 2003/12/24 19:55:07 marcel Exp $
  */
 
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: src/sys/ia64/ia64/dump_machdep.c,v 1.10 2003/12/24 19:55:07 marcel Exp $");
+
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/conf.h>
@@ -34,7 +35,6 @@
 #include <sys/kerneldump.h>
 #include <vm/vm.h>
 #include <vm/pmap.h>
-#include <machine/bootinfo.h>
 #include <machine/efi.h>
 #include <machine/elf.h>
 #include <machine/md_var.h>
@@ -50,7 +50,7 @@
 #define	MD_ALIGN(x)	(((off_t)(x) + EFI_PAGE_MASK) & ~EFI_PAGE_MASK)
 #define	DEV_ALIGN(x)	(((off_t)(x) + (DEV_BSIZE-1)) & ~(DEV_BSIZE-1))
 
-typedef int callback_t(EFI_MEMORY_DESCRIPTOR*, int, void*);
+typedef int callback_t(struct efi_md*, int, void*);
 
 static struct kerneldumpheader kdh;
 static off_t dumplo, fileofs;
@@ -121,7 +121,7 @@
 }
 
 static int
-cb_dumpdata(EFI_MEMORY_DESCRIPTOR *mdp, int seqnr, void *arg)
+cb_dumpdata(struct efi_md *mdp, int seqnr, void *arg)
 {
 	struct dumperinfo *di = (struct dumperinfo*)arg;
 	vm_offset_t pa;
@@ -129,11 +129,11 @@
 	size_t counter, sz;
 	int c, error, twiddle;
 
-	error = 0;	/* catch case in which mdp->NumberOfPages is 0 */
+	error = 0;	/* catch case in which mdp->md_pages is 0 */
 	counter = 0;	/* Update twiddle every 16MB */
 	twiddle = 0;
-	pgs = mdp->NumberOfPages;
-	pa = IA64_PHYS_TO_RR7(mdp->PhysicalStart);
+	pgs = mdp->md_pages;
+	pa = IA64_PHYS_TO_RR7(mdp->md_phys);
 
 	printf("  chunk %d: %ld pages ", seqnr, (long)pgs);
 
@@ -164,7 +164,7 @@
 }
 
 static int
-cb_dumphdr(EFI_MEMORY_DESCRIPTOR *mdp, int seqnr, void *arg)
+cb_dumphdr(struct efi_md *mdp, int seqnr, void *arg)
 {
 	struct dumperinfo *di = (struct dumperinfo*)arg;
 	Elf64_Phdr phdr;
@@ -174,10 +174,10 @@
 	phdr.p_type = PT_LOAD;
 	phdr.p_flags = PF_R;			/* XXX */
 	phdr.p_offset = fileofs;
-	phdr.p_vaddr = mdp->VirtualStart;	/* XXX probably bogus. */
-	phdr.p_paddr = mdp->PhysicalStart;
-	phdr.p_filesz = mdp->NumberOfPages << EFI_PAGE_SHIFT;
-	phdr.p_memsz = mdp->NumberOfPages << EFI_PAGE_SHIFT;
+	phdr.p_vaddr = (uintptr_t)mdp->md_virt;	/* XXX probably bogus. */
+	phdr.p_paddr = mdp->md_phys;
+	phdr.p_filesz = mdp->md_pages << EFI_PAGE_SHIFT;
+	phdr.p_memsz = mdp->md_pages << EFI_PAGE_SHIFT;
 	phdr.p_align = EFI_PAGE_SIZE;
 
 	error = buf_write(di, (char*)&phdr, sizeof(phdr));
@@ -186,35 +186,30 @@
 }
 
 static int
-cb_size(EFI_MEMORY_DESCRIPTOR *mdp, int seqnr, void *arg)
+cb_size(struct efi_md *mdp, int seqnr, void *arg)
 {
 	uint64_t *sz = (uint64_t*)arg;
 
-	*sz += (uint64_t)mdp->NumberOfPages << EFI_PAGE_SHIFT;
+	*sz += (uint64_t)mdp->md_pages << EFI_PAGE_SHIFT;
 	return (0);
 }
 
 static int
 foreach_chunk(callback_t cb, void *arg)
 {
-	EFI_MEMORY_DESCRIPTOR *mdp;
-	int error, i, mdcount, seqnr;
+	struct efi_md *mdp;
+	int error, seqnr;
 
-	mdp = (EFI_MEMORY_DESCRIPTOR *)IA64_PHYS_TO_RR7(bootinfo.bi_memmap);
-	mdcount = bootinfo.bi_memmap_size / bootinfo.bi_memdesc_size;
-
-	if (mdp == NULL || mdcount == 0)
-		return (0);
-
-	for (i = 0, seqnr = 0; i < mdcount; i++) {
-		if (mdp->Type == EfiConventionalMemory) {
+	seqnr = 0;
+	mdp = efi_md_first();
+	while (mdp != NULL) {
+		if (mdp->md_type == EFI_MD_TYPE_FREE) {
 			error = (*cb)(mdp, seqnr++, arg);
 			if (error)
 				return (-error);
 		}
-		mdp = NextMemoryDescriptor(mdp, bootinfo.bi_memdesc_size);
+		mdp = efi_md_next(mdp);
 	}
-
 	return (seqnr);
 }
 

==== //depot/projects/ia64/sys/ia64/ia64/efi.c#6 (text+ko) ====

@@ -1,4 +1,5 @@
 /*-
+ * Copyright (c) 2004 Marcel Moolenaar
  * Copyright (c) 2001 Doug Rabson
  * All rights reserved.
  *
@@ -22,97 +23,134 @@
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
- *
- * $FreeBSD: src/sys/ia64/ia64/efi.c,v 1.4 2003/02/01 22:50:09 marcel Exp $
  */
 
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: src/sys/ia64/ia64/efi.c,v 1.4 2003/02/01 22:50:09 marcel Exp $");
+
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <machine/bootinfo.h>
 #include <machine/efi.h>
 #include <machine/sal.h>
 
-EFI_SYSTEM_TABLE	*ia64_efi_systab;
-EFI_RUNTIME_SERVICES	*ia64_efi_runtime;
-u_int64_t		ia64_efi_acpi_table;
-u_int64_t		ia64_efi_acpi20_table;
+extern uint64_t ia64_call_efi_physical(uint64_t, uint64_t, uint64_t, uint64_t,
+    uint64_t, uint64_t);
 
-extern u_int64_t ia64_call_efi_physical(u_int64_t, u_int64_t, u_int64_t,
-					u_int64_t, u_int64_t, u_int64_t);
+static struct efi_systbl *efi_systbl;
+static struct efi_cfgtbl *efi_cfgtbl;
+static struct efi_rt *efi_runtime;
 
 void
-ia64_efi_init(void)
+efi_boot_finish(void)
+{
+}
+
+/*
+ * Collect the entry points for PAL and SAL. Be extra careful about NULL
+ * pointer values. We're running pre-console, so it's better to return
+ * error values than to cause panics, machine checks and other traps and
+ * faults. Keep this minimal...
+ */
+int
+efi_boot_minimal(uint64_t systbl)
 {
-	EFI_CONFIGURATION_TABLE *conf;
-	struct sal_system_table *saltab = 0;
-	EFI_RUNTIME_SERVICES *rs;
-	EFI_MEMORY_DESCRIPTOR *md, *mdp;
-	int mdcount, i;
-	EFI_STATUS status;
+	struct efi_md *md;
+	efi_status status;
 
-	if (!bootinfo.bi_systab) {
-		printf("No system table!\n");
-		return;
+	if (systbl == 0)
+		return (EINVAL);
+	efi_systbl = (struct efi_systbl *)IA64_PHYS_TO_RR7(systbl);
+	if (efi_systbl->st_hdr.th_sig != EFI_SYSTBL_SIG) {
+		efi_systbl = NULL;
+		return (EFAULT);
 	}
+	efi_cfgtbl = (efi_systbl->st_cfgtbl == 0) ? NULL :
+	    (struct efi_cfgtbl *)IA64_PHYS_TO_RR7(efi_systbl->st_cfgtbl);
+	if (efi_cfgtbl == NULL)
+		return (ENOENT);
+	efi_runtime = (efi_systbl->st_rt == 0) ? NULL :
+	    (struct efi_rt *)IA64_PHYS_TO_RR7(efi_systbl->st_rt);
+	if (efi_runtime == NULL)
+		return (ENOENT);
 
-	ia64_efi_systab = (EFI_SYSTEM_TABLE *)
-	    IA64_PHYS_TO_RR7(bootinfo.bi_systab);
-	rs = (EFI_RUNTIME_SERVICES *)
-	    IA64_PHYS_TO_RR7((u_int64_t)ia64_efi_systab->RuntimeServices);
-	if (!rs)
-		panic("No runtime services!");
-
-	ia64_efi_runtime = rs;
-	conf = (EFI_CONFIGURATION_TABLE *)
-	    IA64_PHYS_TO_RR7((u_int64_t)ia64_efi_systab->ConfigurationTable);
-	if (!conf)
-		panic("No configuration tables!");
-
-	mdcount = bootinfo.bi_memmap_size / bootinfo.bi_memdesc_size;
-	md = (EFI_MEMORY_DESCRIPTOR *) IA64_PHYS_TO_RR7(bootinfo.bi_memmap);
-
-	for (i = 0, mdp = md; i < mdcount; i++,
-		 mdp = NextMemoryDescriptor(mdp, bootinfo.bi_memdesc_size)) {
-		/*
-		 * Relocate runtime memory segments for firmware.
-		 */
-		if (mdp->Attribute & EFI_MEMORY_RUNTIME) {
-			if (mdp->Attribute & EFI_MEMORY_WB)
-				mdp->VirtualStart =
-					IA64_PHYS_TO_RR7(mdp->PhysicalStart);
-			else if (mdp->Attribute & EFI_MEMORY_UC)
-				mdp->VirtualStart =
-					IA64_PHYS_TO_RR6(mdp->PhysicalStart);
+	/*
+	 * Relocate runtime memory segments for firmware.
+	 */
+	md = efi_md_first();
+	while (md != NULL) {
+		if (md->md_attr & EFI_MD_ATTR_RT) {
+			if (md->md_attr & EFI_MD_ATTR_WB)
+				md->md_virt =
+				    (void *)IA64_PHYS_TO_RR7(md->md_phys);
+			else if (md->md_attr & EFI_MD_ATTR_UC)
+				md->md_virt =
+				    (void *)IA64_PHYS_TO_RR6(md->md_phys);
 		}
+		md = efi_md_next(md);
 	}
-
-	status = ia64_call_efi_physical((u_int64_t)rs->SetVirtualAddressMap,
+	status = ia64_call_efi_physical((uint64_t)efi_runtime->rt_setvirtual,
 	    bootinfo.bi_memmap_size, bootinfo.bi_memdesc_size,
 	    bootinfo.bi_memdesc_version, bootinfo.bi_memmap, 0);
+	return ((status < 0) ? EFAULT : 0);
+}
 
-	if (EFI_ERROR(status)) {
-		/*
-		 * We could wrap EFI in a virtual->physical shim here.
-		 */
-		printf("SetVirtualAddressMap returned 0x%lx\n", status);
-		panic("Can't set firmware into virtual mode");
+void *
+efi_get_table(struct uuid *uuid)
+{
+	struct efi_cfgtbl *ct;
+	u_long count;
+
+	if (efi_cfgtbl == NULL)
+		return (NULL);
+	count = efi_systbl->st_entries;
+	ct = efi_cfgtbl;
+	while (count--) {
+		if (!memcmp(&ct->ct_uuid, uuid, sizeof(*uuid)))
+			return ((void *)IA64_PHYS_TO_RR7(ct->ct_data));
+		ct++;
 	}
+	return (NULL);
+}
 
-	for (i = 0; i < ia64_efi_systab->NumberOfTableEntries; i++) {
-		static EFI_GUID sal = SAL_SYSTEM_TABLE_GUID;
-		static EFI_GUID acpi = ACPI_TABLE_GUID;
-		static EFI_GUID acpi20 = ACPI_20_TABLE_GUID;
-		if (!memcmp(&conf[i].VendorGuid, &sal, sizeof(EFI_GUID)))
-			saltab = (struct sal_system_table *)
-			    IA64_PHYS_TO_RR7((u_int64_t) conf[i].VendorTable);
-		if (!memcmp(&conf[i].VendorGuid, &acpi, sizeof(EFI_GUID)))
-			ia64_efi_acpi_table = (u_int64_t) conf[i].VendorTable;
-		if (!memcmp(&conf[i].VendorGuid, &acpi20, sizeof(EFI_GUID)))
-			ia64_efi_acpi20_table = (u_int64_t) conf[i].VendorTable;
-	}
+void
+efi_get_time(struct efi_tm *tm)
+{
+
+	efi_runtime->rt_gettime(tm, NULL);
+}
+
+struct efi_md *
+efi_md_first(void)
+{
+
+	if (bootinfo.bi_memmap == 0)
+		return (NULL);
+	return ((struct efi_md *)IA64_PHYS_TO_RR7(bootinfo.bi_memmap));
+}
+
+struct efi_md *
+efi_md_next(struct efi_md *md)
+{
+	uint64_t plim;
+
+	plim = IA64_PHYS_TO_RR7(bootinfo.bi_memmap + bootinfo.bi_memmap_size);
+	md = (struct efi_md *)((uintptr_t)md + bootinfo.bi_memdesc_size);
+	return ((md >= (struct efi_md *)plim) ? NULL : md);
+}
 
-	if (saltab)
-		ia64_sal_init(saltab);
+void
+efi_reset_system(void)
+{
 
+	if (efi_runtime != NULL)
+		efi_runtime->rt_reset(EFI_RESET_WARM, 0, 0, NULL);
+	panic("%s: unable to reset the machine", __func__);
 }
 
+efi_status
+efi_set_time(struct efi_tm *tm)
+{
+
+	return (efi_runtime->rt_settime(tm));
+}

==== //depot/projects/ia64/sys/ia64/ia64/eficlock.c#3 (text+ko) ====

@@ -22,10 +22,11 @@
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
- *
- *	$FreeBSD: src/sys/ia64/ia64/eficlock.c,v 1.2 2001/11/12 09:29:05 peter Exp $
  */
 
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: src/sys/ia64/ia64/eficlock.c,v 1.2 2001/11/12 09:29:05 peter Exp $");
+
 #include <sys/param.h>
 #include <sys/kernel.h>
 #include <sys/systm.h>
@@ -46,17 +47,17 @@
 static void
 eficlock_get(kobj_t dev, time_t base, struct clocktime *ct)
 {
-	EFI_TIME time;
+	struct efi_tm tm;
 
-	ia64_efi_runtime->GetTime(&time, 0);
+	efi_get_time(&tm);
 
-	ct->sec = time.Second;
-	ct->min = time.Minute;
-	ct->hour = time.Hour;
+	ct->sec = tm.tm_sec;
+	ct->min = tm.tm_min;
+	ct->hour = tm.tm_hour;
 	ct->dow = 0;		/* XXX not used */
-	ct->day = time.Day;
-	ct->mon = time.Month;
-	ct->year = time.Year - 1900;
+	ct->day = tm.tm_mday;
+	ct->mon = tm.tm_mon;
+	ct->year = tm.tm_year - 1900;
 }
 
 /*
@@ -65,18 +66,18 @@
 static void
 eficlock_set(kobj_t dev, struct clocktime *ct)
 {
-	EFI_TIME time;
-	EFI_STATUS status;
+	struct efi_tm tm;
+	efi_status status;
 
-	ia64_efi_runtime->GetTime(&time, 0);
-	time.Second = ct->sec;
-	time.Minute = ct->min;
-	time.Hour = ct->hour;
-	time.Day = ct->day;
-	time.Month = ct->mon;
-	time.Year = ct->year + 1900;
-	status = ia64_efi_runtime->SetTime(&time);
-	if (status != EFI_SUCCESS)
+	efi_get_time(&tm);
+	tm.tm_sec = ct->sec;
+	tm.tm_min = ct->min;
+	tm.tm_hour = ct->hour;
+	tm.tm_mday = ct->day;
+	tm.tm_mon = ct->mon;
+	tm.tm_year = ct->year + 1900;
+	status = efi_set_time(&tm);
+	if (status)
 		printf("eficlock_set: could not set TODR\n");
 }
 

==== //depot/projects/ia64/sys/ia64/ia64/machdep.c#108 (text+ko) ====

@@ -23,10 +23,11 @@
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
- *
- * $FreeBSD: src/sys/ia64/ia64/machdep.c,v 1.186 2004/09/05 02:09:53 julian Exp $
  */
 
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: src/sys/ia64/ia64/machdep.c,v 1.187 2004/09/17 22:19:41 marcel Exp $");
+
 #include "opt_compat.h"
 #include "opt_ddb.h"
 #include "opt_kstack_pages.h"
@@ -110,7 +111,7 @@
 extern u_int64_t break_sigtramp[];
 extern u_int64_t epc_sigtramp[];
 
-FPSWA_INTERFACE *fpswa_interface;
+struct fpswa_iface *fpswa_iface;
 
 u_int64_t ia64_pal_base;
 u_int64_t ia64_port_base;
@@ -257,12 +258,11 @@
 	printf("avail memory = %ld (%ld MB)\n", ptoa(cnt.v_free_count),
 	    ptoa(cnt.v_free_count) / 1048576);
  
-	if (fpswa_interface == NULL)
+	if (fpswa_iface == NULL)
 		printf("Warning: no FPSWA package supplied\n");
 	else
 		printf("FPSWA Revision = 0x%lx, Entry = %p\n",
-		    (long)fpswa_interface->Revision,
-		    (void *)fpswa_interface->Fpswa);
+		    (long)fpswa_iface->if_rev, (void *)fpswa_iface->if_fpswa);
 
 	/*
 	 * Set up buffers, so they can be used to read disk labels.
@@ -282,14 +282,14 @@
 cpu_boot(int howto)
 {
 
-	ia64_efi_runtime->ResetSystem(EfiResetWarm, EFI_SUCCESS, 0, 0);
+	efi_reset_system();
 }
 
 void
 cpu_halt()
 {
 
-	ia64_efi_runtime->ResetSystem(EfiResetWarm, EFI_SUCCESS, 0, 0);
+	efi_reset_system();
 }
 
 static void
@@ -486,8 +486,8 @@
 	vm_offset_t kernstart, kernend;
 	vm_offset_t kernstartpfn, kernendpfn, pfn0, pfn1;
 	char *p;
-	EFI_MEMORY_DESCRIPTOR *md, *mdp;
-	int mdcount, i, metadata_missing;
+	struct efi_md *md;
+	int metadata_missing;
 
 	/* NO OUTPUT ALLOWED UNTIL FURTHER NOTICE */
 
@@ -517,15 +517,15 @@
 	 * Look for the I/O ports first - we need them for console
 	 * probing.
 	 */
-	mdcount = bootinfo.bi_memmap_size / bootinfo.bi_memdesc_size;
-	md = (EFI_MEMORY_DESCRIPTOR *) IA64_PHYS_TO_RR7(bootinfo.bi_memmap);
-
-	for (i = 0, mdp = md; i < mdcount; i++,
-	    mdp = NextMemoryDescriptor(mdp, bootinfo.bi_memdesc_size)) {
-		if (mdp->Type == EfiMemoryMappedIOPortSpace)
-			ia64_port_base = IA64_PHYS_TO_RR6(mdp->PhysicalStart);
-		else if (mdp->Type == EfiPalCode)
-			ia64_pal_base = mdp->PhysicalStart;
+	for (md = efi_md_first(); md != NULL; md = efi_md_next(md)) {
+		switch (md->md_type) {
+		case EFI_MD_TYPE_IOPORT:
+			ia64_port_base = IA64_PHYS_TO_RR6(md->md_phys);
+			break;
+		case EFI_MD_TYPE_PALCODE:
+			ia64_pal_base = md->md_phys;
+			break;
+		}
 	}
 
 	metadata_missing = 0;
@@ -578,7 +578,8 @@
 	 * Wire things up so we can call the firmware.
 	 */
 	map_pal_code();
-	ia64_efi_init();
+	efi_boot_minimal(bootinfo.bi_systab);
+	ia64_sal_init();
 	calculate_frequencies();
 
 	/*
@@ -600,7 +601,7 @@
 		printf("WARNING: loader(8) metadata is missing!\n");
 
 	/* Get FPSWA interface */
-	fpswa_interface = (FPSWA_INTERFACE*)IA64_PHYS_TO_RR7(bootinfo.bi_fpswa);
+	fpswa_iface = (struct fpswa_iface *)IA64_PHYS_TO_RR7(bootinfo.bi_fpswa);
 
 	/* Init basic tunables, including hz */
 	init_param1();
@@ -628,22 +629,18 @@
 #endif
 
 	phys_avail_cnt = 0;
-	for (i = 0, mdp = md; i < mdcount; i++,
-		 mdp = NextMemoryDescriptor(mdp, bootinfo.bi_memdesc_size)) {
+	for (md = efi_md_first(); md != NULL; md = efi_md_next(md)) {
 #ifdef DEBUG_MD
-		printf("MD %d: type %d pa 0x%lx cnt 0x%lx\n", i,
-		       mdp->Type,
-		       mdp->PhysicalStart,
-		       mdp->NumberOfPages);
+		printf("MD %p: type %d pa 0x%lx cnt 0x%lx\n", md,
+		    md->md_type, md->md_phys, md->md_pages);
 #endif
 
-		pfn0 = ia64_btop(round_page(mdp->PhysicalStart));
-		pfn1 = ia64_btop(trunc_page(mdp->PhysicalStart
-					    + mdp->NumberOfPages * 4096));
+		pfn0 = ia64_btop(round_page(md->md_phys));
+		pfn1 = ia64_btop(trunc_page(md->md_phys + md->md_pages * 4096));
 		if (pfn1 <= pfn0)
 			continue;
 
-		if (mdp->Type != EfiConventionalMemory)
+		if (md->md_type != EFI_MD_TYPE_FREE)
 			continue;
 
 		/*
@@ -652,12 +649,12 @@
 		 */
 		if (pfn0 >= ia64_btop(0x100000000UL)) {
 			printf("Skipping memory chunk start 0x%lx\n",
-			    mdp->PhysicalStart);
+			    md->md_phys);
 			continue;
 		}
 		if (pfn1 >= ia64_btop(0x100000000UL)) {
 			printf("Skipping memory chunk end 0x%lx\n",
-			    mdp->PhysicalStart + mdp->NumberOfPages * 4096);
+			    md->md_phys + md->md_pages * 4096);
 			continue;
 		}
 
@@ -673,7 +670,7 @@
 			 * within the segment.
 			 */
 #ifdef DEBUG_MD
-			printf("Descriptor %d contains kernel\n", i);
+			printf("Descriptor %p contains kernel\n", mp);
 #endif
 			if (pfn0 < kernstartpfn) {
 				/*

==== //depot/projects/ia64/sys/ia64/ia64/sal.c#11 (text+ko) ====

@@ -22,16 +22,18 @@
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
- *
- * $FreeBSD: src/sys/ia64/ia64/sal.c,v 1.13 2004/07/25 07:07:09 marcel Exp $
  */
 
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: src/sys/ia64/ia64/sal.c,v 1.13 2004/07/25 07:07:09 marcel Exp $");
+
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/kernel.h>
 #include <sys/malloc.h>
 #include <vm/vm.h>
 #include <vm/vm_kern.h>
+#include <machine/efi.h>
 #include <machine/md_var.h>
 #include <machine/sal.h>
 #include <machine/smp.h>
@@ -49,6 +51,9 @@
 extern u_int64_t	ia64_pal_entry;
 sal_entry_t		*ia64_sal_entry = fake_sal;
 
+static struct uuid sal_table = EFI_TABLE_SAL;
+static struct sal_system_table *sal_systbl;
+
 static struct ia64_sal_result
 fake_sal(u_int64_t a1, u_int64_t a2, u_int64_t a3, u_int64_t a4,
 	 u_int64_t a5, u_int64_t a6, u_int64_t a7, u_int64_t a8)
@@ -77,7 +82,7 @@
 }
 
 void
-ia64_sal_init(struct sal_system_table *saltab)
+ia64_sal_init(void)
 {
 	static int sizes[6] = {
 		48, 32, 16, 32, 16, 16
@@ -85,13 +90,17 @@
 	u_int8_t *p;
 	int i;
 
-	if (memcmp(saltab->sal_signature, SAL_SIGNATURE, 4)) {
+	sal_systbl = efi_get_table(&sal_table);
+	if (sal_systbl == NULL)
+		return;
+
+	if (memcmp(sal_systbl->sal_signature, SAL_SIGNATURE, 4)) {
 		printf("Bad signature for SAL System Table\n");
 		return;
 	}
 
-	p = (u_int8_t *) (saltab + 1);
-	for (i = 0; i < saltab->sal_entry_count; i++) {
+	p = (u_int8_t *) (sal_systbl + 1);
+	for (i = 0; i < sal_systbl->sal_entry_count; i++) {
 		switch (*p) {
 		case 0: {
 			struct sal_entrypoint_descriptor *dp;

==== //depot/projects/ia64/sys/ia64/include/efi.h#4 (text+ko) ====

@@ -1,45 +1,163 @@
-/*-
- * Copyright (c) 2001 Doug Rabson
+/*
+ * Copyright (c) 2004 Marcel Moolenaar
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
+ *
  * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- *	$FreeBSD: src/sys/ia64/include/efi.h,v 1.5 2001/11/19 07:25:42 peter Exp $
+ * $FreeBSD: src/sys/ia64/include/efi.h,v 1.6 2004/09/17 22:19:41 marcel Exp $
  */
 
 #ifndef _MACHINE_EFI_H_
 #define _MACHINE_EFI_H_
 
-#include <boot/efi/include/ia64/efibind.h>
-#include <boot/efi/include/efidef.h>
-#include <boot/efi/include/efierr.h>
-#include <boot/efi/include/efidevp.h>
-#include <boot/efi/include/eficon.h>
-#include <boot/efi/include/efiapi.h>
-#include <boot/efi/include/efifpswa.h>
+#include <sys/uuid.h>
+
+#define	EFI_PAGE_SHIFT		12
+#define	EFI_PAGE_SIZE		(1 << EFI_PAGE_SHIFT)
+#define	EFI_PAGE_MASK		(EFI_PAGE_SIZE - 1)
+
+#define	EFI_TABLE_ACPI20			\
+	{0x8868e871,0xe4f1,0x11d3,0xbc,0x22,{0x00,0x80,0xc7,0x3c,0x88,0x81}}
+#define	EFI_TABLE_SAL				\
+	{0xeb9d2d32,0x2d88,0x11d3,0x9a,0x16,{0x00,0x90,0x27,0x3f,0xc1,0x4d}}
+
+enum efi_reset {
+	EFI_RESET_COLD,
+	EFI_RESET_WARM
+};
+
+typedef uint16_t	efi_char;
+typedef unsigned long efi_status;
+
+struct efi_cfgtbl {
+	struct uuid	ct_uuid;
+	uint64_t	ct_data;
+};
+
+struct efi_md {
+	uint32_t	md_type;
+#define	EFI_MD_TYPE_NULL	0
+#define	EFI_MD_TYPE_CODE	1	/* Loader text. */
+#define	EFI_MD_TYPE_DATA	2	/* Loader data. */
+#define	EFI_MD_TYPE_BS_CODE	3	/* Boot services text. */
+#define	EFI_MD_TYPE_BS_DATA	4	/* Boot services data. */
+#define	EFI_MD_TYPE_RT_CODE	5	/* Runtime services text. */
+#define	EFI_MD_TYPE_RT_DATA	6	/* Runtime services data. */
+#define	EFI_MD_TYPE_FREE	7	/* Unused/free memory. */
+#define	EFI_MD_TYPE_BAD		8	/* Bad memory */
+#define	EFI_MD_TYPE_RECLAIM	9	/* ACPI reclaimable memory. */
+#define	EFI_MD_TYPE_FIRMWARE	10	/* ACPI NV memory */
+#define	EFI_MD_TYPE_IOMEM	11	/* Memory-mapped I/O. */
+#define	EFI_MD_TYPE_IOPORT	12	/* I/O port space. */
+#define	EFI_MD_TYPE_PALCODE	13	/* PAL */
+	uint32_t	__pad;
+	uint64_t	md_phys;
+	void		*md_virt;
+	uint64_t	md_pages;
+	uint64_t	md_attr;
+#define	EFI_MD_ATTR_UC		0x0000000000000001UL
+#define	EFI_MD_ATTR_WC		0x0000000000000002UL
+#define	EFI_MD_ATTR_WT		0x0000000000000004UL
+#define	EFI_MD_ATTR_WB		0x0000000000000008UL
+#define	EFI_MD_ATTR_UCE		0x0000000000000010UL
+#define	EFI_MD_ATTR_WP		0x0000000000001000UL
+#define	EFI_MD_ATTR_RP		0x0000000000002000UL
+#define	EFI_MD_ATTR_XP		0x0000000000004000UL
+#define	EFI_MD_ATTR_RT		0x8000000000000000UL
+};
+
+struct efi_tm {
+	uint16_t	tm_year;		/* 1998 - 20XX */
+	uint8_t		tm_mon;			/* 1 - 12 */
+	uint8_t		tm_mday;		/* 1 - 31 */
+	uint8_t		tm_hour;		/* 0 - 23 */
+	uint8_t		tm_min;			/* 0 - 59 */
+	uint8_t		tm_sec;			/* 0 - 59 */
+	uint8_t		__pad1;
+	uint32_t	tm_nsec;		/* 0 - 999,999,999 */
+	int16_t		tm_tz;			/* -1440 to 1440 or 2047 */
+	uint8_t		tm_dst;
+	uint8_t		__pad2;
+};
+
+struct efi_tmcap {
+	uint32_t	tc_res;		/* 1e-6 parts per million */
+	uint32_t	tc_prec;	/* hertz */
+	uint8_t		tc_stz;		/* Set clears sub-second time */
+};
+
+struct efi_tblhdr {
+	uint64_t	th_sig;
+	uint32_t	th_rev;
+	uint32_t	th_hdrsz;
+	uint32_t	th_crc32;
+	uint32_t	__res;
+};
+
+struct efi_rt {
+	struct efi_tblhdr rt_hdr;
+	efi_status	(*rt_gettime)(struct efi_tm *, struct efi_tmcap *);
+	efi_status	(*rt_settime)(struct efi_tm *);
+	efi_status	(*rt_getwaketime)(uint8_t *, uint8_t *,
+	    struct efi_tm *);
+	efi_status	(*rt_setwaketime)(uint8_t, struct efi_tm *);
+	efi_status	(*rt_setvirtual)(u_long, u_long, uint32_t,
+	    struct efi_md *);
+	efi_status	(*rt_cvtptr)(u_long, void **);
+	efi_status	(*rt_getvar)(efi_char *, struct uuid *, uint32_t *,
+	    u_long *, void *);
+	efi_status	(*rt_scanvar)(u_long *, efi_char *, struct uuid *);
+	efi_status	(*rt_setvar)(efi_char *, struct uuid *, uint32_t,
+	    u_long, void *);
+	efi_status	(*rt_gethicnt)(uint32_t *);
+	efi_status	(*rt_reset)(enum efi_reset, efi_status, u_long,
+	    efi_char *);
+};
 
-extern EFI_SYSTEM_TABLE		*ia64_efi_systab;
-extern EFI_RUNTIME_SERVICES	*ia64_efi_runtime;
+struct efi_systbl {
+	struct efi_tblhdr st_hdr;
+#define	EFI_SYSTBL_SIG	0x5453595320494249UL
+	efi_char	*st_fwvendor;
+	uint32_t	st_fwrev;
+	uint32_t	__pad;
+	void		*st_cin;
+	void		*st_cinif;
+	void		*st_cout;
+	void		*st_coutif;
+	void		*st_cerr;
+	void		*st_cerrif;
+	uint64_t	st_rt;
+	void		*st_bs;
+	u_long		st_entries;
+	uint64_t	st_cfgtbl;
+};
 
-extern void ia64_efi_init(void);
+void efi_boot_finish(void);
+int efi_boot_minimal(uint64_t);
+void *efi_get_table(struct uuid *);
+void efi_get_time(struct efi_tm *);
+struct efi_md *efi_md_first(void);
+struct efi_md *efi_md_next(struct efi_md *);
+void efi_reset_system(void);
+efi_status efi_set_time(struct efi_tm *);
 
 #endif /* _MACHINE_EFI_H_ */

==== //depot/projects/ia64/sys/ia64/include/sal.h#4 (text+ko) ====

@@ -137,6 +137,6 @@
 
 extern sal_entry_t *ia64_sal_entry;
 
-extern void ia64_sal_init(struct sal_system_table *saltab);
+extern void ia64_sal_init(void);
 
 #endif /* _MACHINE_SAL_H_ */


More information about the p4-projects mailing list