diff options
Diffstat (limited to 'sys')
34 files changed, 1419 insertions, 451 deletions
diff --git a/sys/boot/ia64/Makefile.inc b/sys/boot/ia64/Makefile.inc index 81a6d5a..3000e04 100644 --- a/sys/boot/ia64/Makefile.inc +++ b/sys/boot/ia64/Makefile.inc @@ -1,4 +1,4 @@ # $FreeBSD$ # Options used when building standalone components -CFLAGS+= -ffreestanding +CFLAGS+= -ffreestanding -fshort-wchar -Wformat diff --git a/sys/boot/ia64/libski/Makefile b/sys/boot/ia64/libski/Makefile index b6da2c8..92a70a0 100644 --- a/sys/boot/ia64/libski/Makefile +++ b/sys/boot/ia64/libski/Makefile @@ -5,6 +5,7 @@ INTERNALLIB= true SRCS= skiconsole.c time.c copy.c devicename.c module.c exit.c SRCS+= delay.c skifs.c elf_freebsd.c bootinfo.c ssc.c +SRCS+= acpi_stub.c efi_stub.c pal_stub.s sal_stub.c CFLAGS+= -ffreestanding -fpic -g CFLAGS+= -I${.CURDIR}/../include diff --git a/sys/boot/ia64/libski/acpi_stub.c b/sys/boot/ia64/libski/acpi_stub.c new file mode 100644 index 0000000..3187925 --- /dev/null +++ b/sys/boot/ia64/libski/acpi_stub.c @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2003 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 ``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$ + */ + +#include <contrib/dev/acpica/acpi.h> + +#define APIC_IO_SAPIC 6 +#define APIC_LOCAL_SAPIC 7 + +#pragma pack(1) + +typedef struct /* LOCAL SAPIC */ +{ + APIC_HEADER Header; + UINT8 ProcessorId; /* ACPI processor id */ + UINT8 LocalSapicId; /* Processor local SAPIC id */ + UINT8 LocalSapicEid; /* Processor local SAPIC eid */ + UINT8 Reserved[3]; + UINT32 ProcessorEnabled: 1; + UINT32 FlagsReserved: 31; +} LOCAL_SAPIC; + +typedef struct /* IO SAPIC */ +{ + APIC_HEADER Header; + UINT8 IoSapicId; /* I/O SAPIC ID */ + UINT8 Reserved; /* reserved - must be zero */ + UINT32 Vector; /* interrupt base */ + UINT64 IoSapicAddress; /* SAPIC's physical address */ +} IO_SAPIC; + +/* + */ + +struct { + APIC_TABLE Header; + LOCAL_SAPIC cpu0; + LOCAL_SAPIC cpu1; + LOCAL_SAPIC cpu2; + LOCAL_SAPIC cpu3; + IO_SAPIC sapic; +} apic = { + /* Header. */ + { + { + APIC_SIG, /* Signature. */ + sizeof(apic), /* Length of table. */ + 0, /* ACPI minor revision. */ + 0, /* XXX checksum. */ + "FBSD", /* OEM Id. */ + "SKI", /* OEM table Id. */ + 0, /* OEM revision. */ + "FBSD", /* ASL compiler Id. */ + 0 /* ASL revision. */ + }, + 0xfee00000, + }, + /* cpu0. */ + { + { + APIC_LOCAL_SAPIC, /* Type. */ + sizeof(apic.cpu0) /* Length. */ + }, + 0, /* ACPI processor id */ + 0, /* Processor local SAPIC id */ + 0, /* Processor local SAPIC eid */ + { 0, 0, 0 }, + 1, /* FL: Enabled. */ + }, + /* cpu1. */ + { + { + APIC_LOCAL_SAPIC, /* Type. */ + sizeof(apic.cpu1) /* Length. */ + }, + 1, /* ACPI processor id */ + 0, /* Processor local SAPIC id */ + 1, /* Processor local SAPIC eid */ + { 0, 0, 0 }, + 1, /* FL: Enabled. */ + }, + /* cpu2. */ + { + { + APIC_LOCAL_SAPIC, /* Type. */ + sizeof(apic.cpu2) /* Length. */ + }, + 2, /* ACPI processor id */ + 1, /* Processor local SAPIC id */ + 0, /* Processor local SAPIC eid */ + { 0, 0, 0 }, + 0, /* FL: Enabled. */ + }, + /* cpu3. */ + { + { + APIC_LOCAL_SAPIC, /* Type. */ + sizeof(apic.cpu3) /* Length. */ + }, + 3, /* ACPI processor id */ + 1, /* Processor local SAPIC id */ + 1, /* Processor local SAPIC eid */ + { 0, 0, 0 }, + 0, /* FL: Enabled. */ + }, + /* sapic. */ + { + { + APIC_IO_SAPIC, /* Type. */ + sizeof(apic.sapic) /* Length. */ + }, + 4, /* IO SAPIC id. */ + 0, + 16, /* Interrupt base. */ + 0xfec00000 /* IO SAPIC address. */ + } +}; + +struct { + ACPI_TABLE_HEADER Header; + UINT64 apic_tbl; +} xsdt = { + { + XSDT_SIG, /* Signature. */ + sizeof(xsdt), /* Length of table. */ + 0, /* ACPI minor revision. */ + 0, /* XXX checksum. */ + "FBSD", /* OEM Id. */ + "SKI", /* OEM table Id. */ + 0, /* OEM revision. */ + "FBSD", /* ASL compiler Id. */ + 0 /* ASL revision. */ + }, + NULL /* XXX APIC table address. */ +}; + +RSDP_DESCRIPTOR acpi_root = { + RSDP_SIG, + 0, /* XXX checksum. */ + "FBSD", + 2, /* ACPI Rev 2.0. */ + NULL, + sizeof(xsdt), /* XSDT length. */ + NULL, /* XXX PA of XSDT. */ + 0, /* XXX Extended checksum. */ +}; + +static void +cksum(void *addr, int sz, UINT8 *sum) +{ + UINT8 *p, s; + + p = addr; + s = 0; + while (sz--) + s += *p++; + *sum = -s; +} + +void +acpi_stub_init(void) +{ + acpi_root.XsdtPhysicalAddress = (UINT64)&xsdt; + cksum(&acpi_root, 20, &acpi_root.Checksum); + cksum(&acpi_root, sizeof(acpi_root), &acpi_root.ExtendedChecksum); + + xsdt.apic_tbl = (UINT32)&apic; + cksum(&xsdt, sizeof(xsdt), &xsdt.Header.Checksum); +} diff --git a/sys/boot/ia64/libski/bootinfo.c b/sys/boot/ia64/libski/bootinfo.c index 0a18ec7..91f691a 100644 --- a/sys/boot/ia64/libski/bootinfo.c +++ b/sys/boot/ia64/libski/bootinfo.c @@ -34,8 +34,6 @@ #include <machine/elf.h> #include <machine/bootinfo.h> -#include <efi.h> - #include "bootstrap.h" /* @@ -60,6 +58,7 @@ static struct }; extern char *ski_fmtdev(void *vdev); +extern int ski_init_stubs(struct bootinfo *); int bi_getboothowto(char *kargs) @@ -250,7 +249,6 @@ bi_load(struct bootinfo *bi, struct preloaded_file *fp, char *args) char *kernelname; vm_offset_t ssym, esym; struct file_metadata *md; - EFI_MEMORY_DESCRIPTOR *memp; /* * Version 1 bootinfo. @@ -320,25 +318,5 @@ bi_load(struct bootinfo *bi, struct preloaded_file *fp, char *args) /* all done copying stuff in, save end of loaded object space */ bi->bi_kernend = addr; - /* Describe the SKI memory map. */ - bi->bi_memmap = (u_int64_t)(bi + 1); - bi->bi_memmap_size = 2 * sizeof(EFI_MEMORY_DESCRIPTOR); - bi->bi_memdesc_size = sizeof(EFI_MEMORY_DESCRIPTOR); - bi->bi_memdesc_version = 1; - - memp = (EFI_MEMORY_DESCRIPTOR *) bi->bi_memmap; - - memp[0].Type = EfiConventionalMemory; - memp[0].PhysicalStart = 2L*1024*1024; - memp[0].VirtualStart = 0; - memp[0].NumberOfPages = (64L*1024*1024)>>12; - memp[0].Attribute = EFI_MEMORY_WB; - - memp[1].Type = EfiMemoryMappedIOPortSpace; - memp[1].PhysicalStart = 0xffffc000000; - memp[1].VirtualStart = 0; - memp[1].NumberOfPages = (64L*1024*1024)>>12; - memp[1].Attribute = EFI_MEMORY_UC; - - return(0); + return (ski_init_stubs(bi)); } diff --git a/sys/boot/ia64/libski/efi_stub.c b/sys/boot/ia64/libski/efi_stub.c new file mode 100644 index 0000000..36f72c3 --- /dev/null +++ b/sys/boot/ia64/libski/efi_stub.c @@ -0,0 +1,267 @@ +/* + * Copyright (c) 2003 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 ``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$ + */ + +#include <sys/types.h> +#include <machine/bootinfo.h> +#include <efi.h> +#include <stand.h> +#include "libski.h" + +extern void acpi_root; +extern void sal_systab; + +extern void acpi_stub_init(void); +extern void sal_stub_init(void); + +EFI_CONFIGURATION_TABLE efi_cfgtab[] = { + { ACPI_20_TABLE_GUID, &acpi_root }, + { SAL_SYSTEM_TABLE_GUID, &sal_systab } +}; + + +static EFI_STATUS GetTime(EFI_TIME *, EFI_TIME_CAPABILITIES *); +static EFI_STATUS SetTime(EFI_TIME *); +static EFI_STATUS GetWakeupTime(BOOLEAN *, BOOLEAN *, EFI_TIME *); +static EFI_STATUS SetWakeupTime(BOOLEAN, EFI_TIME *); + +static EFI_STATUS SetVirtualAddressMap(UINTN, UINTN, UINT32, + EFI_MEMORY_DESCRIPTOR*); +static EFI_STATUS ConvertPointer(UINTN, VOID **); + +static EFI_STATUS GetVariable(CHAR16 *, EFI_GUID *, UINT32 *, UINTN *, VOID *); +static EFI_STATUS GetNextVariableName(UINTN *, CHAR16 *, EFI_GUID *); +static EFI_STATUS SetVariable(CHAR16 *, EFI_GUID *, UINT32, UINTN, VOID *); + +static EFI_STATUS GetNextHighMonotonicCount(UINT32 *); +static EFI_STATUS ResetSystem(EFI_RESET_TYPE, EFI_STATUS, UINTN, CHAR16 *); + +EFI_RUNTIME_SERVICES efi_rttab = { + /* Header. */ + { EFI_RUNTIME_SERVICES_SIGNATURE, + EFI_RUNTIME_SERVICES_REVISION, + 0, /* XXX HeaderSize */ + 0, /* XXX CRC32 */ + }, + + /* Time services */ + GetTime, + SetTime, + GetWakeupTime, + SetWakeupTime, + + /* Virtual memory services */ + SetVirtualAddressMap, + ConvertPointer, + + /* Variable services */ + GetVariable, + GetNextVariableName, + SetVariable, + + /* Misc */ + GetNextHighMonotonicCount, + ResetSystem +}; + +EFI_SYSTEM_TABLE efi_systab = { + /* Header. */ + { EFI_SYSTEM_TABLE_SIGNATURE, + EFI_SYSTEM_TABLE_REVISION, + 0, /* XXX HeaderSize */ + 0, /* XXX CRC32 */ + }, + + /* Firmware info. */ + L"FreeBSD", 0, + + /* Console stuff. */ + NULL, NULL, + NULL, NULL, + NULL, NULL, + + /* Services (runtime first). */ + &efi_rttab, + NULL, + + /* Configuration tables. */ + sizeof(efi_cfgtab)/sizeof(EFI_CONFIGURATION_TABLE), + efi_cfgtab +}; + +static EFI_STATUS +unsupported(const char *func) +{ + printf("EFI: %s not supported\n", func); + return (EFI_UNSUPPORTED); +} + +static EFI_STATUS +GetTime(EFI_TIME *time, EFI_TIME_CAPABILITIES *caps) +{ + UINT32 comps[8]; + + ssc((UINT64)comps, 0, 0, 0, SSC_GET_RTC); + time->Year = comps[0] + 1900; + time->Month = comps[1] + 1; + time->Day = comps[2]; + time->Hour = comps[3]; + time->Minute = comps[4]; + time->Second = comps[5]; + time->Pad1 = time->Pad2 = 0; + time->Nanosecond = 0; + time->TimeZone = 0; + time->Daylight = 0; + return (EFI_SUCCESS); +} + +static EFI_STATUS +SetTime(EFI_TIME *time) +{ + return (EFI_SUCCESS); +} + +static EFI_STATUS +GetWakeupTime(BOOLEAN *enabled, BOOLEAN *pending, EFI_TIME *time) +{ + return (unsupported(__func__)); +} + +static EFI_STATUS +SetWakeupTime(BOOLEAN enable, EFI_TIME *time) +{ + return (unsupported(__func__)); +} + +static void +Reloc(void *addr, UINT64 delta) +{ + UINT64 **fpp = addr; + + *fpp[0] += delta; + *fpp[1] += delta; + *fpp += delta >> 3; +} + +static EFI_STATUS +SetVirtualAddressMap(UINTN mapsz, UINTN descsz, UINT32 version, + EFI_MEMORY_DESCRIPTOR *memmap) +{ + UINT64 delta; + + delta = memmap->VirtualStart - memmap->PhysicalStart; + Reloc(&efi_rttab.GetTime, delta); + Reloc(&efi_rttab.SetTime, delta); + return (EFI_SUCCESS); /* Hah... */ +} + +static EFI_STATUS +ConvertPointer(UINTN debug, VOID **addr) +{ + return (unsupported(__func__)); +} + +static EFI_STATUS +GetVariable(CHAR16 *name, EFI_GUID *vendor, UINT32 *attrs, UINTN *datasz, + VOID *data) +{ + return (unsupported(__func__)); +} + +static EFI_STATUS +GetNextVariableName(UINTN *namesz, CHAR16 *name, EFI_GUID *vendor) +{ + return (unsupported(__func__)); +} + +static EFI_STATUS +SetVariable(CHAR16 *name, EFI_GUID *vendor, UINT32 attrs, UINTN datasz, + VOID *data) +{ + return (unsupported(__func__)); +} + +static EFI_STATUS +GetNextHighMonotonicCount(UINT32 *high) +{ + static UINT32 counter = 0; + + *high = counter++; + return (EFI_SUCCESS); +} + +static EFI_STATUS +ResetSystem(EFI_RESET_TYPE type, EFI_STATUS status, UINTN datasz, + CHAR16 *data) +{ + return (unsupported(__func__)); +} + +int +ski_init_stubs(struct bootinfo *bi) +{ + EFI_MEMORY_DESCRIPTOR *memp; + + /* Describe the SKI memory map. */ + bi->bi_memmap = (u_int64_t)(bi + 1); + bi->bi_memmap_size = 4 * sizeof(EFI_MEMORY_DESCRIPTOR); + bi->bi_memdesc_size = sizeof(EFI_MEMORY_DESCRIPTOR); + bi->bi_memdesc_version = 1; + + memp = (EFI_MEMORY_DESCRIPTOR *)bi->bi_memmap; + + memp[0].Type = EfiPalCode; + memp[0].PhysicalStart = 0x100000; + memp[0].VirtualStart = 0; + memp[0].NumberOfPages = (4L*1024*1024)>>12; + memp[0].Attribute = EFI_MEMORY_WB | EFI_MEMORY_RUNTIME; + + memp[1].Type = EfiConventionalMemory; + memp[1].PhysicalStart = 5L*1024*1024; + memp[1].VirtualStart = 0; + memp[1].NumberOfPages = (128L*1024*1024)>>12; + memp[1].Attribute = EFI_MEMORY_WB; + + memp[2].Type = EfiConventionalMemory; + memp[2].PhysicalStart = 4L*1024*1024*1024; + memp[2].VirtualStart = 0; + memp[2].NumberOfPages = (64L*1024*1024)>>12; + memp[2].Attribute = EFI_MEMORY_WB; + + memp[3].Type = EfiMemoryMappedIOPortSpace; + memp[3].PhysicalStart = 0xffffc000000; + memp[3].VirtualStart = 0; + memp[3].NumberOfPages = (64L*1024*1024)>>12; + memp[3].Attribute = EFI_MEMORY_UC; + + bi->bi_systab = (u_int64_t)&efi_systab; + + sal_stub_init(); + acpi_stub_init(); + + return (0); +} diff --git a/sys/boot/ia64/libski/elf_freebsd.c b/sys/boot/ia64/libski/elf_freebsd.c index 461ef12..e72a52d 100644 --- a/sys/boot/ia64/libski/elf_freebsd.c +++ b/sys/boot/ia64/libski/elf_freebsd.c @@ -130,6 +130,8 @@ struct ia64_pte { u_int64_t pte_ig :11; /* bits 53..63 */ }; +static struct bootinfo bootinfo; + void enter_kernel(const char* filename, u_int64_t start, struct bootinfo *bi) { @@ -167,7 +169,7 @@ elf_exec(struct preloaded_file *fp) * Ugly hack, similar to linux. Dump the bootinfo into a * special page reserved in the link map. */ - bi = (struct bootinfo *) 0x508000; + bi = &bootinfo; bzero(bi, sizeof(struct bootinfo)); bi_load(bi, fp); diff --git a/sys/boot/ia64/libski/libski.h b/sys/boot/ia64/libski/libski.h index bb3f1dd..043177c 100644 --- a/sys/boot/ia64/libski/libski.h +++ b/sys/boot/ia64/libski/libski.h @@ -90,6 +90,7 @@ extern int bi_load(struct bootinfo *, struct preloaded_file *); #define SSC_GET_RTC 65 #define SSC_EXIT 66 #define SSC_LOAD_SYMBOLS 69 +#define SSC_SAL_SET_VECTORS 120 u_int64_t ssc(u_int64_t in0, u_int64_t in1, u_int64_t in2, u_int64_t in3, int which); diff --git a/sys/boot/ia64/libski/pal_stub.S b/sys/boot/ia64/libski/pal_stub.S new file mode 100644 index 0000000..e67204c --- /dev/null +++ b/sys/boot/ia64/libski/pal_stub.S @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2003 Marcel Moolenaar + * Copyright (c) 2001 Doug Rabson + * 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. + * + * $FreeBSD$ + */ + +#include <machine/asm.h> + + .text +ENTRY(PalProc, 0) + cmp.eq p6,p0=6,r28 // PAL_PTCE_INFO +(p6) br.cond.dptk pal_ptce_info + ;; + cmp.eq p6,p0=8,r28 // PAL_VM_SUMMARY +(p6) br.cond.dptk pal_vm_summary + ;; + cmp.eq p6,p0=14,r28 // PAL_FREQ_RATIOS +(p6) br.cond.dptk pal_freq_ratios + ;; + mov r15=66 // EXIT + break.i 0x80000 // SSC + ;; +pal_ptce_info: + mov r8=0 + mov r9=0 // base + movl r10=0x0000000100000001 // loop counts (outer|inner) + mov r11=0x0000000000000000 // loop strides (outer|inner) + br.sptk b0 +pal_vm_summary: + mov r8=0 + movl r9=(8<<40)|(8<<32) // VM info 1 + mov r10=(18<<8)|(41<<0) // VM info 2 + mov r11=0 + br.sptk b0 +pal_freq_ratios: + mov r8=0 + movl r9=0x0000000B00000002 // processor ratio 11/2 + movl r10=0x0000000100000001 // bus ratio 1/1 + movl r11=0x0000000B00000002 // ITC ratio 11/2 + br.sptk b0 +END(PalProc) diff --git a/sys/ia64/ia64/pal_stub.s b/sys/boot/ia64/libski/pal_stub.s index b91d02c..e67204c 100644 --- a/sys/ia64/ia64/pal_stub.s +++ b/sys/boot/ia64/libski/pal_stub.s @@ -1,10 +1,12 @@ -/*- +/* + * Copyright (c) 2003 Marcel Moolenaar * Copyright (c) 2001 Doug Rabson * 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 @@ -23,44 +25,41 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD$ + * $FreeBSD$ */ #include <machine/asm.h> -#include <assym.s> - -/* - * Stub for running in simulation. Fakes the values from an SDV. - */ -ENTRY(ski_fake_pal, 0) - mov r8=-3 // default to return error - - cmp.eq p6,p0=PAL_PTCE_INFO,r28 - ;; -(p6) mov r8=0 -(p6) mov r9=0 -(p6) movl r10=0x100000001 -(p6) mov r11=0 + .text +ENTRY(PalProc, 0) + cmp.eq p6,p0=6,r28 // PAL_PTCE_INFO +(p6) br.cond.dptk pal_ptce_info ;; - cmp.eq p6,p0=PAL_FREQ_RATIOS,r28 + cmp.eq p6,p0=8,r28 // PAL_VM_SUMMARY +(p6) br.cond.dptk pal_vm_summary ;; -(p6) mov r8=0 -(p6) movl r9=0xb00000002 // proc 11/1 -(p6) movl r10=0x100000001 // bus 1/1 -(p6) movl r11=0xb00000002 // itc 11/1 - mov r14=PAL_VM_SUMMARY + cmp.eq p6,p0=14,r28 // PAL_FREQ_RATIOS +(p6) br.cond.dptk pal_freq_ratios ;; - cmp.eq p6,p0=r14,r28 - ;; -(p6) mov r8=0 -(p6) movl r9=(8<<40)|(8<<32) -(p6) movl r10=(18<<8)|(41<<0) -(p6) mov r11=0 + mov r15=66 // EXIT + break.i 0x80000 // SSC ;; - tbit.nz p6,p7=r28,8 // static or stacked? - ;; -(p6) br.ret.sptk.few rp -(p7) br.cond.sptk.few rp - -END(ski_fake_pal) +pal_ptce_info: + mov r8=0 + mov r9=0 // base + movl r10=0x0000000100000001 // loop counts (outer|inner) + mov r11=0x0000000000000000 // loop strides (outer|inner) + br.sptk b0 +pal_vm_summary: + mov r8=0 + movl r9=(8<<40)|(8<<32) // VM info 1 + mov r10=(18<<8)|(41<<0) // VM info 2 + mov r11=0 + br.sptk b0 +pal_freq_ratios: + mov r8=0 + movl r9=0x0000000B00000002 // processor ratio 11/2 + movl r10=0x0000000100000001 // bus ratio 1/1 + movl r11=0x0000000B00000002 // ITC ratio 11/2 + br.sptk b0 +END(PalProc) diff --git a/sys/boot/ia64/libski/sal_stub.c b/sys/boot/ia64/libski/sal_stub.c new file mode 100644 index 0000000..caa6671 --- /dev/null +++ b/sys/boot/ia64/libski/sal_stub.c @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2003 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 ``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$ + */ + +#include <sys/types.h> +#include <machine/md_var.h> +#include <machine/sal.h> +#include <stand.h> +#include "libski.h" + +extern void PalProc(void); +static sal_entry_t SalProc; + +struct { + struct sal_system_table header; + struct sal_entrypoint_descriptor entry; + struct sal_ap_wakeup_descriptor wakeup; +} sal_systab = { + /* Header. */ + { + SAL_SIGNATURE, + sizeof(sal_systab), + { 00, 03 }, /* Revision 3.0. */ + 2, /* Number of decsriptors. */ + 0, /* XXX checksum. */ + { 0 }, + { 00, 00 }, /* XXX SAL_A version. */ + { 00, 00 }, /* XXX SAL_B version. */ + "FreeBSD", + "Ski loader", + { 0 } + }, + /* Entrypoint. */ + { + 0, /* Type=entrypoint descr. */ + { 0 }, + 0, /* XXX PalProc. */ + 0, /* XXX SalProc. */ + 0, /* XXX SalProc GP. */ + { 0 } + }, + /* AP wakeup. */ + { + 5, /* Type=AP wakeup descr. */ + 0, /* External interrupt. */ + { 0 }, + 255 /* Wakeup vector. */ + } +}; + +static inline void +puts(const char *s) +{ + s = (const char *)((7UL << 61) | (u_long)s); + while (*s) + ski_cons_putchar(*s++); +} + +static struct ia64_sal_result +SalProc(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) +{ + struct ia64_sal_result res; + + res.sal_status = -3; + res.sal_result[0] = 0; + res.sal_result[1] = 0; + res.sal_result[2] = 0; + + if (a1 == SAL_FREQ_BASE) { + res.sal_status = 0; + res.sal_result[0] = 133338184; + } else if (a1 == SAL_SET_VECTORS) { + /* XXX unofficial SSC function. */ + ssc(a2, a3, a4, a5, SSC_SAL_SET_VECTORS); + } else if (a1 != SAL_GET_STATE_INFO_SIZE) { + puts("SAL: unimplemented function called\n"); + } + + return (res); +} + +void +sal_stub_init(void) +{ + struct ia64_fdesc *fd; + + fd = (void*)PalProc; + sal_systab.entry.sale_pal_proc = fd->func; + fd = (void*)SalProc; + sal_systab.entry.sale_sal_proc = fd->func; + sal_systab.entry.sale_sal_gp = fd->gp; +} diff --git a/sys/boot/ia64/libski/ssc.c b/sys/boot/ia64/libski/ssc.c index 11a91c8..e3e9eb2 100644 --- a/sys/boot/ia64/libski/ssc.c +++ b/sys/boot/ia64/libski/ssc.c @@ -29,14 +29,24 @@ #include <stand.h> #include "libski.h" +/* + * Ugh... Work around a bug in the Linux version of ski for SSC_GET_RTC. The + * PSR.dt register is not preserved properly and causes further memory + * references to be done without translation. All we need to do is preserve + * PSR.dt across the SSC call. We do this by saving and restoring psr.l + * completely. + */ u_int64_t ssc(u_int64_t in0, u_int64_t in1, u_int64_t in2, u_int64_t in3, int which) { + register u_int64_t psr; register u_int64_t ret0 __asm("r8"); + __asm __volatile("mov %0=psr;;" : "=r"(psr)); __asm __volatile("mov r15=%1\n\t" - "break 0x80000" + "break 0x80000;;" : "=r"(ret0) : "r"(which), "r"(in0), "r"(in1), "r"(in2), "r"(in3)); + __asm __volatile("mov psr.l=%0;; srlz.d" :: "r"(psr)); return ret0; } diff --git a/sys/boot/ia64/ski/acpi_stub.c b/sys/boot/ia64/ski/acpi_stub.c new file mode 100644 index 0000000..3187925 --- /dev/null +++ b/sys/boot/ia64/ski/acpi_stub.c @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2003 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 ``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$ + */ + +#include <contrib/dev/acpica/acpi.h> + +#define APIC_IO_SAPIC 6 +#define APIC_LOCAL_SAPIC 7 + +#pragma pack(1) + +typedef struct /* LOCAL SAPIC */ +{ + APIC_HEADER Header; + UINT8 ProcessorId; /* ACPI processor id */ + UINT8 LocalSapicId; /* Processor local SAPIC id */ + UINT8 LocalSapicEid; /* Processor local SAPIC eid */ + UINT8 Reserved[3]; + UINT32 ProcessorEnabled: 1; + UINT32 FlagsReserved: 31; +} LOCAL_SAPIC; + +typedef struct /* IO SAPIC */ +{ + APIC_HEADER Header; + UINT8 IoSapicId; /* I/O SAPIC ID */ + UINT8 Reserved; /* reserved - must be zero */ + UINT32 Vector; /* interrupt base */ + UINT64 IoSapicAddress; /* SAPIC's physical address */ +} IO_SAPIC; + +/* + */ + +struct { + APIC_TABLE Header; + LOCAL_SAPIC cpu0; + LOCAL_SAPIC cpu1; + LOCAL_SAPIC cpu2; + LOCAL_SAPIC cpu3; + IO_SAPIC sapic; +} apic = { + /* Header. */ + { + { + APIC_SIG, /* Signature. */ + sizeof(apic), /* Length of table. */ + 0, /* ACPI minor revision. */ + 0, /* XXX checksum. */ + "FBSD", /* OEM Id. */ + "SKI", /* OEM table Id. */ + 0, /* OEM revision. */ + "FBSD", /* ASL compiler Id. */ + 0 /* ASL revision. */ + }, + 0xfee00000, + }, + /* cpu0. */ + { + { + APIC_LOCAL_SAPIC, /* Type. */ + sizeof(apic.cpu0) /* Length. */ + }, + 0, /* ACPI processor id */ + 0, /* Processor local SAPIC id */ + 0, /* Processor local SAPIC eid */ + { 0, 0, 0 }, + 1, /* FL: Enabled. */ + }, + /* cpu1. */ + { + { + APIC_LOCAL_SAPIC, /* Type. */ + sizeof(apic.cpu1) /* Length. */ + }, + 1, /* ACPI processor id */ + 0, /* Processor local SAPIC id */ + 1, /* Processor local SAPIC eid */ + { 0, 0, 0 }, + 1, /* FL: Enabled. */ + }, + /* cpu2. */ + { + { + APIC_LOCAL_SAPIC, /* Type. */ + sizeof(apic.cpu2) /* Length. */ + }, + 2, /* ACPI processor id */ + 1, /* Processor local SAPIC id */ + 0, /* Processor local SAPIC eid */ + { 0, 0, 0 }, + 0, /* FL: Enabled. */ + }, + /* cpu3. */ + { + { + APIC_LOCAL_SAPIC, /* Type. */ + sizeof(apic.cpu3) /* Length. */ + }, + 3, /* ACPI processor id */ + 1, /* Processor local SAPIC id */ + 1, /* Processor local SAPIC eid */ + { 0, 0, 0 }, + 0, /* FL: Enabled. */ + }, + /* sapic. */ + { + { + APIC_IO_SAPIC, /* Type. */ + sizeof(apic.sapic) /* Length. */ + }, + 4, /* IO SAPIC id. */ + 0, + 16, /* Interrupt base. */ + 0xfec00000 /* IO SAPIC address. */ + } +}; + +struct { + ACPI_TABLE_HEADER Header; + UINT64 apic_tbl; +} xsdt = { + { + XSDT_SIG, /* Signature. */ + sizeof(xsdt), /* Length of table. */ + 0, /* ACPI minor revision. */ + 0, /* XXX checksum. */ + "FBSD", /* OEM Id. */ + "SKI", /* OEM table Id. */ + 0, /* OEM revision. */ + "FBSD", /* ASL compiler Id. */ + 0 /* ASL revision. */ + }, + NULL /* XXX APIC table address. */ +}; + +RSDP_DESCRIPTOR acpi_root = { + RSDP_SIG, + 0, /* XXX checksum. */ + "FBSD", + 2, /* ACPI Rev 2.0. */ + NULL, + sizeof(xsdt), /* XSDT length. */ + NULL, /* XXX PA of XSDT. */ + 0, /* XXX Extended checksum. */ +}; + +static void +cksum(void *addr, int sz, UINT8 *sum) +{ + UINT8 *p, s; + + p = addr; + s = 0; + while (sz--) + s += *p++; + *sum = -s; +} + +void +acpi_stub_init(void) +{ + acpi_root.XsdtPhysicalAddress = (UINT64)&xsdt; + cksum(&acpi_root, 20, &acpi_root.Checksum); + cksum(&acpi_root, sizeof(acpi_root), &acpi_root.ExtendedChecksum); + + xsdt.apic_tbl = (UINT32)&apic; + cksum(&xsdt, sizeof(xsdt), &xsdt.Header.Checksum); +} diff --git a/sys/boot/ia64/ski/bootinfo.c b/sys/boot/ia64/ski/bootinfo.c index 0a18ec7..91f691a 100644 --- a/sys/boot/ia64/ski/bootinfo.c +++ b/sys/boot/ia64/ski/bootinfo.c @@ -34,8 +34,6 @@ #include <machine/elf.h> #include <machine/bootinfo.h> -#include <efi.h> - #include "bootstrap.h" /* @@ -60,6 +58,7 @@ static struct }; extern char *ski_fmtdev(void *vdev); +extern int ski_init_stubs(struct bootinfo *); int bi_getboothowto(char *kargs) @@ -250,7 +249,6 @@ bi_load(struct bootinfo *bi, struct preloaded_file *fp, char *args) char *kernelname; vm_offset_t ssym, esym; struct file_metadata *md; - EFI_MEMORY_DESCRIPTOR *memp; /* * Version 1 bootinfo. @@ -320,25 +318,5 @@ bi_load(struct bootinfo *bi, struct preloaded_file *fp, char *args) /* all done copying stuff in, save end of loaded object space */ bi->bi_kernend = addr; - /* Describe the SKI memory map. */ - bi->bi_memmap = (u_int64_t)(bi + 1); - bi->bi_memmap_size = 2 * sizeof(EFI_MEMORY_DESCRIPTOR); - bi->bi_memdesc_size = sizeof(EFI_MEMORY_DESCRIPTOR); - bi->bi_memdesc_version = 1; - - memp = (EFI_MEMORY_DESCRIPTOR *) bi->bi_memmap; - - memp[0].Type = EfiConventionalMemory; - memp[0].PhysicalStart = 2L*1024*1024; - memp[0].VirtualStart = 0; - memp[0].NumberOfPages = (64L*1024*1024)>>12; - memp[0].Attribute = EFI_MEMORY_WB; - - memp[1].Type = EfiMemoryMappedIOPortSpace; - memp[1].PhysicalStart = 0xffffc000000; - memp[1].VirtualStart = 0; - memp[1].NumberOfPages = (64L*1024*1024)>>12; - memp[1].Attribute = EFI_MEMORY_UC; - - return(0); + return (ski_init_stubs(bi)); } diff --git a/sys/boot/ia64/ski/efi_stub.c b/sys/boot/ia64/ski/efi_stub.c new file mode 100644 index 0000000..36f72c3 --- /dev/null +++ b/sys/boot/ia64/ski/efi_stub.c @@ -0,0 +1,267 @@ +/* + * Copyright (c) 2003 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 ``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$ + */ + +#include <sys/types.h> +#include <machine/bootinfo.h> +#include <efi.h> +#include <stand.h> +#include "libski.h" + +extern void acpi_root; +extern void sal_systab; + +extern void acpi_stub_init(void); +extern void sal_stub_init(void); + +EFI_CONFIGURATION_TABLE efi_cfgtab[] = { + { ACPI_20_TABLE_GUID, &acpi_root }, + { SAL_SYSTEM_TABLE_GUID, &sal_systab } +}; + + +static EFI_STATUS GetTime(EFI_TIME *, EFI_TIME_CAPABILITIES *); +static EFI_STATUS SetTime(EFI_TIME *); +static EFI_STATUS GetWakeupTime(BOOLEAN *, BOOLEAN *, EFI_TIME *); +static EFI_STATUS SetWakeupTime(BOOLEAN, EFI_TIME *); + +static EFI_STATUS SetVirtualAddressMap(UINTN, UINTN, UINT32, + EFI_MEMORY_DESCRIPTOR*); +static EFI_STATUS ConvertPointer(UINTN, VOID **); + +static EFI_STATUS GetVariable(CHAR16 *, EFI_GUID *, UINT32 *, UINTN *, VOID *); +static EFI_STATUS GetNextVariableName(UINTN *, CHAR16 *, EFI_GUID *); +static EFI_STATUS SetVariable(CHAR16 *, EFI_GUID *, UINT32, UINTN, VOID *); + +static EFI_STATUS GetNextHighMonotonicCount(UINT32 *); +static EFI_STATUS ResetSystem(EFI_RESET_TYPE, EFI_STATUS, UINTN, CHAR16 *); + +EFI_RUNTIME_SERVICES efi_rttab = { + /* Header. */ + { EFI_RUNTIME_SERVICES_SIGNATURE, + EFI_RUNTIME_SERVICES_REVISION, + 0, /* XXX HeaderSize */ + 0, /* XXX CRC32 */ + }, + + /* Time services */ + GetTime, + SetTime, + GetWakeupTime, + SetWakeupTime, + + /* Virtual memory services */ + SetVirtualAddressMap, + ConvertPointer, + + /* Variable services */ + GetVariable, + GetNextVariableName, + SetVariable, + + /* Misc */ + GetNextHighMonotonicCount, + ResetSystem +}; + +EFI_SYSTEM_TABLE efi_systab = { + /* Header. */ + { EFI_SYSTEM_TABLE_SIGNATURE, + EFI_SYSTEM_TABLE_REVISION, + 0, /* XXX HeaderSize */ + 0, /* XXX CRC32 */ + }, + + /* Firmware info. */ + L"FreeBSD", 0, + + /* Console stuff. */ + NULL, NULL, + NULL, NULL, + NULL, NULL, + + /* Services (runtime first). */ + &efi_rttab, + NULL, + + /* Configuration tables. */ + sizeof(efi_cfgtab)/sizeof(EFI_CONFIGURATION_TABLE), + efi_cfgtab +}; + +static EFI_STATUS +unsupported(const char *func) +{ + printf("EFI: %s not supported\n", func); + return (EFI_UNSUPPORTED); +} + +static EFI_STATUS +GetTime(EFI_TIME *time, EFI_TIME_CAPABILITIES *caps) +{ + UINT32 comps[8]; + + ssc((UINT64)comps, 0, 0, 0, SSC_GET_RTC); + time->Year = comps[0] + 1900; + time->Month = comps[1] + 1; + time->Day = comps[2]; + time->Hour = comps[3]; + time->Minute = comps[4]; + time->Second = comps[5]; + time->Pad1 = time->Pad2 = 0; + time->Nanosecond = 0; + time->TimeZone = 0; + time->Daylight = 0; + return (EFI_SUCCESS); +} + +static EFI_STATUS +SetTime(EFI_TIME *time) +{ + return (EFI_SUCCESS); +} + +static EFI_STATUS +GetWakeupTime(BOOLEAN *enabled, BOOLEAN *pending, EFI_TIME *time) +{ + return (unsupported(__func__)); +} + +static EFI_STATUS +SetWakeupTime(BOOLEAN enable, EFI_TIME *time) +{ + return (unsupported(__func__)); +} + +static void +Reloc(void *addr, UINT64 delta) +{ + UINT64 **fpp = addr; + + *fpp[0] += delta; + *fpp[1] += delta; + *fpp += delta >> 3; +} + +static EFI_STATUS +SetVirtualAddressMap(UINTN mapsz, UINTN descsz, UINT32 version, + EFI_MEMORY_DESCRIPTOR *memmap) +{ + UINT64 delta; + + delta = memmap->VirtualStart - memmap->PhysicalStart; + Reloc(&efi_rttab.GetTime, delta); + Reloc(&efi_rttab.SetTime, delta); + return (EFI_SUCCESS); /* Hah... */ +} + +static EFI_STATUS +ConvertPointer(UINTN debug, VOID **addr) +{ + return (unsupported(__func__)); +} + +static EFI_STATUS +GetVariable(CHAR16 *name, EFI_GUID *vendor, UINT32 *attrs, UINTN *datasz, + VOID *data) +{ + return (unsupported(__func__)); +} + +static EFI_STATUS +GetNextVariableName(UINTN *namesz, CHAR16 *name, EFI_GUID *vendor) +{ + return (unsupported(__func__)); +} + +static EFI_STATUS +SetVariable(CHAR16 *name, EFI_GUID *vendor, UINT32 attrs, UINTN datasz, + VOID *data) +{ + return (unsupported(__func__)); +} + +static EFI_STATUS +GetNextHighMonotonicCount(UINT32 *high) +{ + static UINT32 counter = 0; + + *high = counter++; + return (EFI_SUCCESS); +} + +static EFI_STATUS +ResetSystem(EFI_RESET_TYPE type, EFI_STATUS status, UINTN datasz, + CHAR16 *data) +{ + return (unsupported(__func__)); +} + +int +ski_init_stubs(struct bootinfo *bi) +{ + EFI_MEMORY_DESCRIPTOR *memp; + + /* Describe the SKI memory map. */ + bi->bi_memmap = (u_int64_t)(bi + 1); + bi->bi_memmap_size = 4 * sizeof(EFI_MEMORY_DESCRIPTOR); + bi->bi_memdesc_size = sizeof(EFI_MEMORY_DESCRIPTOR); + bi->bi_memdesc_version = 1; + + memp = (EFI_MEMORY_DESCRIPTOR *)bi->bi_memmap; + + memp[0].Type = EfiPalCode; + memp[0].PhysicalStart = 0x100000; + memp[0].VirtualStart = 0; + memp[0].NumberOfPages = (4L*1024*1024)>>12; + memp[0].Attribute = EFI_MEMORY_WB | EFI_MEMORY_RUNTIME; + + memp[1].Type = EfiConventionalMemory; + memp[1].PhysicalStart = 5L*1024*1024; + memp[1].VirtualStart = 0; + memp[1].NumberOfPages = (128L*1024*1024)>>12; + memp[1].Attribute = EFI_MEMORY_WB; + + memp[2].Type = EfiConventionalMemory; + memp[2].PhysicalStart = 4L*1024*1024*1024; + memp[2].VirtualStart = 0; + memp[2].NumberOfPages = (64L*1024*1024)>>12; + memp[2].Attribute = EFI_MEMORY_WB; + + memp[3].Type = EfiMemoryMappedIOPortSpace; + memp[3].PhysicalStart = 0xffffc000000; + memp[3].VirtualStart = 0; + memp[3].NumberOfPages = (64L*1024*1024)>>12; + memp[3].Attribute = EFI_MEMORY_UC; + + bi->bi_systab = (u_int64_t)&efi_systab; + + sal_stub_init(); + acpi_stub_init(); + + return (0); +} diff --git a/sys/boot/ia64/ski/elf_freebsd.c b/sys/boot/ia64/ski/elf_freebsd.c index 461ef12..e72a52d 100644 --- a/sys/boot/ia64/ski/elf_freebsd.c +++ b/sys/boot/ia64/ski/elf_freebsd.c @@ -130,6 +130,8 @@ struct ia64_pte { u_int64_t pte_ig :11; /* bits 53..63 */ }; +static struct bootinfo bootinfo; + void enter_kernel(const char* filename, u_int64_t start, struct bootinfo *bi) { @@ -167,7 +169,7 @@ elf_exec(struct preloaded_file *fp) * Ugly hack, similar to linux. Dump the bootinfo into a * special page reserved in the link map. */ - bi = (struct bootinfo *) 0x508000; + bi = &bootinfo; bzero(bi, sizeof(struct bootinfo)); bi_load(bi, fp); diff --git a/sys/boot/ia64/ski/libski.h b/sys/boot/ia64/ski/libski.h index bb3f1dd..043177c 100644 --- a/sys/boot/ia64/ski/libski.h +++ b/sys/boot/ia64/ski/libski.h @@ -90,6 +90,7 @@ extern int bi_load(struct bootinfo *, struct preloaded_file *); #define SSC_GET_RTC 65 #define SSC_EXIT 66 #define SSC_LOAD_SYMBOLS 69 +#define SSC_SAL_SET_VECTORS 120 u_int64_t ssc(u_int64_t in0, u_int64_t in1, u_int64_t in2, u_int64_t in3, int which); diff --git a/sys/boot/ia64/ski/pal_stub.S b/sys/boot/ia64/ski/pal_stub.S new file mode 100644 index 0000000..e67204c --- /dev/null +++ b/sys/boot/ia64/ski/pal_stub.S @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2003 Marcel Moolenaar + * Copyright (c) 2001 Doug Rabson + * 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. + * + * $FreeBSD$ + */ + +#include <machine/asm.h> + + .text +ENTRY(PalProc, 0) + cmp.eq p6,p0=6,r28 // PAL_PTCE_INFO +(p6) br.cond.dptk pal_ptce_info + ;; + cmp.eq p6,p0=8,r28 // PAL_VM_SUMMARY +(p6) br.cond.dptk pal_vm_summary + ;; + cmp.eq p6,p0=14,r28 // PAL_FREQ_RATIOS +(p6) br.cond.dptk pal_freq_ratios + ;; + mov r15=66 // EXIT + break.i 0x80000 // SSC + ;; +pal_ptce_info: + mov r8=0 + mov r9=0 // base + movl r10=0x0000000100000001 // loop counts (outer|inner) + mov r11=0x0000000000000000 // loop strides (outer|inner) + br.sptk b0 +pal_vm_summary: + mov r8=0 + movl r9=(8<<40)|(8<<32) // VM info 1 + mov r10=(18<<8)|(41<<0) // VM info 2 + mov r11=0 + br.sptk b0 +pal_freq_ratios: + mov r8=0 + movl r9=0x0000000B00000002 // processor ratio 11/2 + movl r10=0x0000000100000001 // bus ratio 1/1 + movl r11=0x0000000B00000002 // ITC ratio 11/2 + br.sptk b0 +END(PalProc) diff --git a/sys/boot/ia64/ski/sal_stub.c b/sys/boot/ia64/ski/sal_stub.c new file mode 100644 index 0000000..caa6671 --- /dev/null +++ b/sys/boot/ia64/ski/sal_stub.c @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2003 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 ``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$ + */ + +#include <sys/types.h> +#include <machine/md_var.h> +#include <machine/sal.h> +#include <stand.h> +#include "libski.h" + +extern void PalProc(void); +static sal_entry_t SalProc; + +struct { + struct sal_system_table header; + struct sal_entrypoint_descriptor entry; + struct sal_ap_wakeup_descriptor wakeup; +} sal_systab = { + /* Header. */ + { + SAL_SIGNATURE, + sizeof(sal_systab), + { 00, 03 }, /* Revision 3.0. */ + 2, /* Number of decsriptors. */ + 0, /* XXX checksum. */ + { 0 }, + { 00, 00 }, /* XXX SAL_A version. */ + { 00, 00 }, /* XXX SAL_B version. */ + "FreeBSD", + "Ski loader", + { 0 } + }, + /* Entrypoint. */ + { + 0, /* Type=entrypoint descr. */ + { 0 }, + 0, /* XXX PalProc. */ + 0, /* XXX SalProc. */ + 0, /* XXX SalProc GP. */ + { 0 } + }, + /* AP wakeup. */ + { + 5, /* Type=AP wakeup descr. */ + 0, /* External interrupt. */ + { 0 }, + 255 /* Wakeup vector. */ + } +}; + +static inline void +puts(const char *s) +{ + s = (const char *)((7UL << 61) | (u_long)s); + while (*s) + ski_cons_putchar(*s++); +} + +static struct ia64_sal_result +SalProc(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) +{ + struct ia64_sal_result res; + + res.sal_status = -3; + res.sal_result[0] = 0; + res.sal_result[1] = 0; + res.sal_result[2] = 0; + + if (a1 == SAL_FREQ_BASE) { + res.sal_status = 0; + res.sal_result[0] = 133338184; + } else if (a1 == SAL_SET_VECTORS) { + /* XXX unofficial SSC function. */ + ssc(a2, a3, a4, a5, SSC_SAL_SET_VECTORS); + } else if (a1 != SAL_GET_STATE_INFO_SIZE) { + puts("SAL: unimplemented function called\n"); + } + + return (res); +} + +void +sal_stub_init(void) +{ + struct ia64_fdesc *fd; + + fd = (void*)PalProc; + sal_systab.entry.sale_pal_proc = fd->func; + fd = (void*)SalProc; + sal_systab.entry.sale_sal_proc = fd->func; + sal_systab.entry.sale_sal_gp = fd->gp; +} diff --git a/sys/boot/ia64/ski/ssc.c b/sys/boot/ia64/ski/ssc.c index 11a91c8..e3e9eb2 100644 --- a/sys/boot/ia64/ski/ssc.c +++ b/sys/boot/ia64/ski/ssc.c @@ -29,14 +29,24 @@ #include <stand.h> #include "libski.h" +/* + * Ugh... Work around a bug in the Linux version of ski for SSC_GET_RTC. The + * PSR.dt register is not preserved properly and causes further memory + * references to be done without translation. All we need to do is preserve + * PSR.dt across the SSC call. We do this by saving and restoring psr.l + * completely. + */ u_int64_t ssc(u_int64_t in0, u_int64_t in1, u_int64_t in2, u_int64_t in3, int which) { + register u_int64_t psr; register u_int64_t ret0 __asm("r8"); + __asm __volatile("mov %0=psr;;" : "=r"(psr)); __asm __volatile("mov r15=%1\n\t" - "break 0x80000" + "break 0x80000;;" : "=r"(ret0) : "r"(which), "r"(in0), "r"(in1), "r"(in2), "r"(in3)); + __asm __volatile("mov psr.l=%0;; srlz.d" :: "r"(psr)); return ret0; } diff --git a/sys/conf/files.ia64 b/sys/conf/files.ia64 index 8be7eb7..dd9dd5a 100644 --- a/sys/conf/files.ia64 +++ b/sys/conf/files.ia64 @@ -50,12 +50,10 @@ ia64/ia64/mem.c standard ia64/ia64/mp_machdep.c optional smp ia64/ia64/nexus.c standard ia64/ia64/pal.s standard -ia64/ia64/pal_stub.s optional ski ia64/ia64/pmap.c standard ia64/ia64/sal.c standard ia64/ia64/sapic.c standard ia64/ia64/setjmp.s standard -ia64/ia64/ski.c optional ski ia64/ia64/support.s standard ia64/ia64/ssc.c optional ski ia64/ia64/sscdisk.c optional ski diff --git a/sys/ia64/conf/SKI b/sys/ia64/conf/SKI index 1b8f179..10443cd 100644 --- a/sys/ia64/conf/SKI +++ b/sys/ia64/conf/SKI @@ -25,59 +25,45 @@ machine ia64 cpu ITANIUM ident SKI -maxusers 32 - -#To statically compile in device wiring instead of /boot/device.hints -#hints "GENERIC.hints" +maxusers 0 makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols -makeoptions NO_CPU_COPTFLAGS=true #Ignore any x86 CPUTYPE +makeoptions NO_MODULES=yes #Ignore any x86 CPUTYPE -options SKI #Support for HP simulator -options SCHED_4BSD #4BSD scheduler -options INET #InterNETworking -#options INET6 #IPv6 communications protocols -options FFS #Berkeley Fast Filesystem -options SOFTUPDATES #Enable FFS soft updates support -options MD_ROOT #MD is a potential root device -options PROCFS #Process filesystem (requires PSEUDOFS) -options PSEUDOFS #Pseudo-filesystem framework options COMPAT_43 #Compatible with BSD 4.3 [KEEP THIS!] options COMPAT_FREEBSD4 -options SCSI_DELAY=2000 #Delay (in ms) before probing SCSI -options KTRACE #ktrace(1) syscall trace support -options SYSVSHM #SYSV-style shared memory -options SYSVMSG #SYSV-style message queues -options SYSVSEM #SYSV-style semaphores -options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions -options CONSPEED=115200 -options BREAK_TO_DEBUGGER #a BREAK on a comconsole goes to - -# Debugging for use in -current options DDB +options FFS #Berkeley Fast Filesystem +options INET #InterNETworking +options INET6 #IPv6 communications protocols options INVARIANTS options INVARIANT_SUPPORT -options WITNESS - options KTR -options KTR_ENTRIES=1024 +options KTRACE #ktrace(1) syscall trace support options KTR_COMPILE="(KTR_INTR|KTR_PROC)" -options KTR_MASK=0 options KTR_CPUMASK=0x3 -#options KTR_VERBOSE +options KTR_ENTRIES=1024 +options KTR_MASK=0 +options KTR_VERBOSE +options MD_ROOT #MD is a potential root device +options PROCFS #Process filesystem (requires PSEUDOFS) +options PSEUDOFS #Pseudo-filesystem framework +options SCHED_4BSD #4BSD scheduler +options SCSI_DELAY=500 #Delay (in ms) before probing SCSI +options SKI +options SOFTUPDATES #Enable FFS soft updates support +options SYSVMSG #SYSV-style message queues +options SYSVSEM #SYSV-style semaphores +options SYSVSHM #SYSV-style shared memory +options WITNESS +options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions -# Pseudo devices - the number indicates how many units to allocated. -device random # Entropy device -device loop # Network loopback +device acpi +device bpf # Berkeley packet filter device ether # Ethernet support -device sl # Kernel SLIP -device ppp # Kernel PPP -device tun # Packet tunnel. -device pty # Pseudo-ttys (telnet etc) +device loop # Network loopback device md # Memory "disks" -device gif # IPv6 and IPv4 tunneling -device faith # IPv6-to-IPv4 relaying/(translation) - -# The `bpf' device enables the Berkeley Packet Filter. -# Be aware of the administrative consequences of enabling this! -device bpf #Berkeley packet filter +device pci +device pty # Pseudo-ttys (telnet etc) +device random # Entropy device +device tun # Packet tunnel. diff --git a/sys/ia64/ia64/autoconf.c b/sys/ia64/ia64/autoconf.c index c58f4f2..65da451 100644 --- a/sys/ia64/ia64/autoconf.c +++ b/sys/ia64/ia64/autoconf.c @@ -105,8 +105,7 @@ cpu_rootconf() #endif #ifdef BOOTP - if (!ia64_running_in_simulator()) - bootpc_init(); + bootpc_init(); #endif #if defined(NFSCLIENT) && defined(NFS_ROOT) #if !defined(BOOTP_NFSROOT) diff --git a/sys/ia64/ia64/efi.c b/sys/ia64/ia64/efi.c index ab6917c..a9a8fd2 100644 --- a/sys/ia64/ia64/efi.c +++ b/sys/ia64/ia64/efi.c @@ -40,35 +40,6 @@ u_int64_t ia64_efi_acpi20_table; 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 EFI_STATUS fake_efi_proc(void); - -static EFI_RUNTIME_SERVICES fake_efi = { - { EFI_RUNTIME_SERVICES_SIGNATURE, - EFI_RUNTIME_SERVICES_REVISION, - 0, 0, 0 }, - - (EFI_GET_TIME) fake_efi_proc, - (EFI_SET_TIME) fake_efi_proc, - (EFI_GET_WAKEUP_TIME) fake_efi_proc, - (EFI_SET_WAKEUP_TIME) fake_efi_proc, - - (EFI_SET_VIRTUAL_ADDRESS_MAP) fake_efi_proc, - (EFI_CONVERT_POINTER) fake_efi_proc, - - (EFI_GET_VARIABLE) fake_efi_proc, - (EFI_GET_NEXT_VARIABLE_NAME) fake_efi_proc, - (EFI_SET_VARIABLE) fake_efi_proc, - - (EFI_GET_NEXT_HIGH_MONO_COUNT) fake_efi_proc, - (EFI_RESET_SYSTEM) fake_efi_proc -}; - -static EFI_STATUS -fake_efi_proc(void) -{ - return EFI_UNSUPPORTED; -} - void ia64_efi_init(void) { @@ -78,14 +49,25 @@ ia64_efi_init(void) EFI_MEMORY_DESCRIPTOR *md, *mdp; int mdcount, i; EFI_STATUS status; - - ia64_efi_runtime = &fake_efi; if (!bootinfo.bi_systab) { printf("No system table!\n"); return; } + 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); @@ -104,19 +86,9 @@ ia64_efi_init(void) } } - 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); - ia64_efi_runtime = rs; - - status = ia64_call_efi_physical - ((u_int64_t) rs->SetVirtualAddressMap, - bootinfo.bi_memmap_size, - bootinfo.bi_memdesc_size, - bootinfo.bi_memdesc_version, - bootinfo.bi_memmap, 0); + status = ia64_call_efi_physical((u_int64_t)rs->SetVirtualAddressMap, + bootinfo.bi_memmap_size, bootinfo.bi_memdesc_size, + bootinfo.bi_memdesc_version, bootinfo.bi_memmap, 0); if (EFI_ERROR(status)) { /* @@ -126,8 +98,6 @@ ia64_efi_init(void) panic("Can't set firmware into virtual mode"); } - conf = (EFI_CONFIGURATION_TABLE *) - IA64_PHYS_TO_RR7((u_int64_t) ia64_efi_systab->ConfigurationTable); for (i = 0; i < ia64_efi_systab->NumberOfTableEntries; i++) { static EFI_GUID sal = SAL_SYSTEM_TABLE_GUID; static EFI_GUID acpi = ACPI_TABLE_GUID; diff --git a/sys/ia64/ia64/machdep.c b/sys/ia64/ia64/machdep.c index 02ab39d..8de0d9c 100644 --- a/sys/ia64/ia64/machdep.c +++ b/sys/ia64/ia64/machdep.c @@ -28,14 +28,9 @@ #include "opt_compat.h" #include "opt_ddb.h" -#include "opt_ski.h" #include "opt_msgbuf.h" #include "opt_acpi.h" -#if !defined(SKI) && !defined(DEV_ACPI) -#error "You need the SKI option and/or the acpi device" -#endif - #include <sys/param.h> #include <sys/systm.h> #include <sys/eventhandler.h> @@ -92,10 +87,6 @@ #include <machine/unwind.h> #include <i386/include/specialreg.h> -#ifdef SKI -extern void ia64_ski_init(void); -#endif - u_int64_t processor_frequency; u_int64_t bus_frequency; u_int64_t itc_frequency; @@ -104,6 +95,7 @@ int cold = 1; u_int64_t pa_bootinfo; struct bootinfo bootinfo; +struct pcpu early_pcpu; extern char kstack[]; struct user *proc0uarea; vm_offset_t proc0kstack; @@ -205,21 +197,12 @@ cpu_startup(dummy) bufinit(); vm_pager_bufferinit(); - if (!ia64_running_in_simulator()) { -#ifdef DEV_ACPI - /* - * Traverse the MADT to discover IOSAPIC and Local SAPIC - * information. - */ - ia64_probe_sapics(); - ia64_mca_init(); -#else - /* - * It is an error to boot a SKI-only kernel on hardware. - */ - panic("Mandatory 'device acpi' is missing"); -#endif - } + /* + * Traverse the MADT to discover IOSAPIC and Local SAPIC + * information. + */ + ia64_probe_sapics(); + ia64_mca_init(); } void @@ -411,30 +394,6 @@ ia64_init(u_int64_t arg1, u_int64_t arg2) */ mdcount = bootinfo.bi_memmap_size / bootinfo.bi_memdesc_size; md = (EFI_MEMORY_DESCRIPTOR *) IA64_PHYS_TO_RR7(bootinfo.bi_memmap); - if (md == NULL || mdcount == 0) { -#ifdef SKI - static EFI_MEMORY_DESCRIPTOR ski_md[2]; - /* - * XXX hack for ski. In reality, the loader will probably ask - * EFI and pass the results to us. Possibly, we will call EFI - * directly. - */ - ski_md[0].Type = EfiConventionalMemory; - ski_md[0].PhysicalStart = 2L*1024*1024; - ski_md[0].VirtualStart = 0; - ski_md[0].NumberOfPages = (64L*1024*1024)>>12; - ski_md[0].Attribute = EFI_MEMORY_WB; - - ski_md[1].Type = EfiMemoryMappedIOPortSpace; - ski_md[1].PhysicalStart = 0xffffc000000; - ski_md[1].VirtualStart = 0; - ski_md[1].NumberOfPages = (64L*1024*1024)>>12; - ski_md[1].Attribute = EFI_MEMORY_UC; - - md = ski_md; - mdcount = 2; -#endif - } for (i = 0, mdp = md; i < mdcount; i++, mdp = NextMemoryDescriptor(mdp, bootinfo.bi_memdesc_size)) { @@ -444,9 +403,6 @@ ia64_init(u_int64_t arg1, u_int64_t arg2) ia64_pal_base = mdp->PhysicalStart; } - /* Map the memory mapped I/O Port space */ - KASSERT(ia64_port_base != 0, - ("%s: no I/O port memory region", __func__)); map_port_space(); metadata_missing = 0; @@ -503,9 +459,6 @@ ia64_init(u_int64_t arg1, u_int64_t arg2) */ map_pal_code(); ia64_efi_init(); -#ifdef SKI - ia64_ski_init(); -#endif calculate_frequencies(); /* @@ -734,12 +687,6 @@ ia64_init(u_int64_t arg1, u_int64_t arg2) ia64_set_tpr(0); } -int -ia64_running_in_simulator() -{ - return bootinfo.bi_systab == 0; -} - void bzero(void *buf, size_t len) { diff --git a/sys/ia64/ia64/mca.c b/sys/ia64/ia64/mca.c index ca24cab..4109e3d 100644 --- a/sys/ia64/ia64/mca.c +++ b/sys/ia64/ia64/mca.c @@ -198,14 +198,15 @@ ia64_mca_init(void) } max_size = round_page(max_size); - p = contigmalloc(max_size, M_TEMP, 0, 0ul, 256*1024*1024 - 1, - PAGE_SIZE, 256*1024*1024); - - mca_info_block = IA64_PHYS_TO_RR7(ia64_tpa((u_int64_t)p)); - - if (bootverbose) - printf("MCA: allocated %ld bytes for state information\n", - max_size); + if (max_size) { + p = contigmalloc(max_size, M_TEMP, 0, 0ul, 256*1024*1024 - 1, + PAGE_SIZE, 256*1024*1024); + mca_info_block = IA64_PHYS_TO_RR7(ia64_tpa((u_int64_t)p)); + + if (bootverbose) + printf("MCA: allocated %ld bytes for state info.\n", + max_size); + } /* * Initialize the spin lock used to protect the info block. When APs diff --git a/sys/ia64/ia64/pal.S b/sys/ia64/ia64/pal.S index 4c5abe5..eca57ac 100644 --- a/sys/ia64/ia64/pal.S +++ b/sys/ia64/ia64/pal.S @@ -30,23 +30,10 @@ .data .global ia64_pal_entry -ia64_pal_entry: .quad ia64_call_pal_stub +ia64_pal_entry: .quad 0 .text /* - * Stub for running in simulation. - */ -ENTRY(ia64_call_pal_stub, 0) - - mov r8=-3 - tbit.nz p6,p7=r28,8 // static or stacked? - ;; -(p6) br.ret.sptk.few rp -(p7) br.cond.sptk.few rp - -END(ia64_call_pal_stub) - -/* * struct ia64_pal_result ia64_call_pal_static(u_int64_t proc, * u_int64_t arg1, u_int64_t arg2, u_int64_t arg3) */ diff --git a/sys/ia64/ia64/pal.s b/sys/ia64/ia64/pal.s index 4c5abe5..eca57ac 100644 --- a/sys/ia64/ia64/pal.s +++ b/sys/ia64/ia64/pal.s @@ -30,23 +30,10 @@ .data .global ia64_pal_entry -ia64_pal_entry: .quad ia64_call_pal_stub +ia64_pal_entry: .quad 0 .text /* - * Stub for running in simulation. - */ -ENTRY(ia64_call_pal_stub, 0) - - mov r8=-3 - tbit.nz p6,p7=r28,8 // static or stacked? - ;; -(p6) br.ret.sptk.few rp -(p7) br.cond.sptk.few rp - -END(ia64_call_pal_stub) - -/* * struct ia64_pal_result ia64_call_pal_static(u_int64_t proc, * u_int64_t arg1, u_int64_t arg2, u_int64_t arg3) */ diff --git a/sys/ia64/ia64/pmap.c b/sys/ia64/ia64/pmap.c index ac5c4cf..cb3d1d3 100644 --- a/sys/ia64/ia64/pmap.c +++ b/sys/ia64/ia64/pmap.c @@ -207,9 +207,7 @@ static struct ia64_lpte **kptdir; vm_offset_t kernel_vm_end; -/* - * Values for ptc.e. XXX values for SKI. - */ +/* Values for ptc.e. XXX values for SKI. */ static u_int64_t pmap_ptc_e_base = 0x100000000; static u_int64_t pmap_ptc_e_count1 = 3; static u_int64_t pmap_ptc_e_count2 = 2; diff --git a/sys/ia64/ia64/sal.c b/sys/ia64/ia64/sal.c index f16d796..24ae989 100644 --- a/sys/ia64/ia64/sal.c +++ b/sys/ia64/ia64/sal.c @@ -85,7 +85,7 @@ ia64_sal_init(struct sal_system_table *saltab) u_int8_t *p; int i; - if (memcmp(saltab->sal_signature, "SST_", 4)) { + if (memcmp(saltab->sal_signature, SAL_SIGNATURE, 4)) { printf("Bad signature for SAL System Table\n"); return; } diff --git a/sys/ia64/ia64/ski.c b/sys/ia64/ia64/ski.c deleted file mode 100644 index a387000..0000000 --- a/sys/ia64/ia64/ski.c +++ /dev/null @@ -1,163 +0,0 @@ -/*- - * Copyright (c) 2001 Doug Rabson - * 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. - * - * $FreeBSD$ - */ - -/* - * Fake out bits of EFI and SAL when running under SKI. - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <machine/efi.h> -#include <machine/sal.h> -#include <machine/md_var.h> - -struct ssc_time { - int year; - int month; - int day; - int hour; - int minute; - int second; - int msec; - int wday; -}; - -#define SSC_GET_RTC 65 - -static u_int64_t -ssc(u_int64_t in0, u_int64_t in1, u_int64_t in2, u_int64_t in3, int which) -{ - register u_int64_t ret0 __asm("r8"); - - __asm __volatile("mov r15=%1\n\t" - "break 0x80001" - : "=r"(ret0) - : "r"(which), "r"(in0), "r"(in1), "r"(in2), "r"(in3)); - - /* - * Ugh... Work around a bug in the Linux version of ski for - * SSC_GET_RTC. The PSR.dt register is not preserved properly - * and causes further memory references to be done without - * translation. All we need to do is set PSR.dt again. Note - * that dependency violations do not exist in ski, so we - * don't have to serialize. - */ - __asm __volatile("ssm psr.dt"); - - return ret0; -} - -extern u_int64_t ski_fake_pal[]; /* *not* a function decl */ -extern void ia64_ski_init(void); -extern u_int64_t ia64_pal_entry; - -static EFI_STATUS ski_fake_efi_proc(void); -static EFI_STATUS ski_fake_efi_get_time(EFI_TIME *time, - EFI_TIME_CAPABILITIES *caps); - -static EFI_RUNTIME_SERVICES ski_fake_efi = { - { EFI_RUNTIME_SERVICES_SIGNATURE, - EFI_RUNTIME_SERVICES_REVISION, - 0, 0, 0 }, - - (EFI_GET_TIME) ski_fake_efi_get_time, - (EFI_SET_TIME) ski_fake_efi_proc, - (EFI_GET_WAKEUP_TIME) ski_fake_efi_proc, - (EFI_SET_WAKEUP_TIME) ski_fake_efi_proc, - - (EFI_SET_VIRTUAL_ADDRESS_MAP) ski_fake_efi_proc, - (EFI_CONVERT_POINTER) ski_fake_efi_proc, - - (EFI_GET_VARIABLE) ski_fake_efi_proc, - (EFI_GET_NEXT_VARIABLE_NAME) ski_fake_efi_proc, - (EFI_SET_VARIABLE) ski_fake_efi_proc, - - (EFI_GET_NEXT_HIGH_MONO_COUNT) ski_fake_efi_proc, - (EFI_RESET_SYSTEM) ski_fake_efi_proc -}; - -static EFI_STATUS -ski_fake_efi_get_time(EFI_TIME *time, EFI_TIME_CAPABILITIES *caps) -{ - struct ssc_time ssctime; - - ssc(ia64_tpa((vm_offset_t) &ssctime), 0, 0, 0, SSC_GET_RTC); - - time->Second = ssctime.second; - time->Minute = ssctime.minute; - time->Hour = ssctime.hour; - time->Day = ssctime.day; - time->Month = ssctime.month + 1; - time->Year = ssctime.year + 1900; - - return EFI_SUCCESS; -} - -static EFI_STATUS -ski_fake_efi_proc(void) -{ - return EFI_UNSUPPORTED; -} - -static struct ia64_sal_result -ski_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) -{ - struct ia64_sal_result res; - - if (a1 == SAL_FREQ_BASE) { - /* - * Fake the values from my SDV. - */ - res.sal_status = 0; - res.sal_result[0] = 133347096; - res.sal_result[1] = 0; - res.sal_result[2] = 0; - return res; - } - - /* - * Return an error for anything we don't care about. - */ - res.sal_status = -3; - res.sal_result[0] = 0; - res.sal_result[1] = 0; - res.sal_result[2] = 0; - return res; -} - -void -ia64_ski_init(void) -{ - if (!ia64_running_in_simulator()) - return; - - ia64_efi_runtime = &ski_fake_efi; - ia64_pal_entry = (u_int64_t) ski_fake_pal; - ia64_sal_entry = ski_fake_sal; -} diff --git a/sys/ia64/ia64/ssc.c b/sys/ia64/ia64/ssc.c index a18eae9..6c3cb35 100644 --- a/sys/ia64/ia64/ssc.c +++ b/sys/ia64/ia64/ssc.c @@ -99,9 +99,6 @@ ssc(u_int64_t in0, u_int64_t in1, u_int64_t in2, u_int64_t in3, int which) static void ssccnprobe(struct consdev *cp) { - if (!ia64_running_in_simulator()) - return; - cp->cn_dev = makedev(CDEV_MAJOR, 0); cp->cn_pri = CN_INTERNAL; } @@ -114,8 +111,6 @@ ssccninit(struct consdev *cp) static void ssccnattach(void *arg) { - if (!ia64_running_in_simulator()) - return; make_dev(&ssc_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "ssccons"); } SYSINIT(ssccnattach, SI_SUB_DRIVERS, SI_ORDER_ANY, ssccnattach, 0); diff --git a/sys/ia64/ia64/sscdisk.c b/sys/ia64/ia64/sscdisk.c index c4d5195..561ffc5 100644 --- a/sys/ia64/ia64/sscdisk.c +++ b/sys/ia64/ia64/sscdisk.c @@ -288,9 +288,6 @@ ssc_clone (void *arg, char *name, int namelen, dev_t *dev) static void ssc_drvinit(void *unused) { - if (!ia64_running_in_simulator()) - return; - ssccreate(-1); } diff --git a/sys/ia64/include/md_var.h b/sys/ia64/include/md_var.h index 706294f..38d98de 100644 --- a/sys/ia64/include/md_var.h +++ b/sys/ia64/include/md_var.h @@ -53,7 +53,6 @@ struct ia64_fdesc { void busdma_swi(void); void cpu_halt(void); void cpu_reset(void); -int ia64_running_in_simulator(void); int is_physical_memory(vm_offset_t addr); void os_boot_rendez(void); void os_mca(void); diff --git a/sys/ia64/include/sal.h b/sys/ia64/include/sal.h index 40940f5..abe7c1f 100644 --- a/sys/ia64/include/sal.h +++ b/sys/ia64/include/sal.h @@ -31,6 +31,7 @@ struct sal_system_table { char sal_signature[4]; +#define SAL_SIGNATURE "SST_" u_int32_t sal_length; u_int8_t sal_rev[2]; u_int16_t sal_entry_count; |