This commit was generated by cvs2svn to compensate for changes in r49187,

which included commits to RCS files with non-trunk default branches.
This commit is contained in:
se 1999-07-28 20:28:47 +00:00
commit 39d00d4fc7
28 changed files with 3009 additions and 0 deletions

6
sys/boot/arc/Makefile Normal file
View File

@ -0,0 +1,6 @@
# $Id: Makefile,v 1.1.1.1 1998/08/21 03:17:41 msmith Exp $
SUBDIR= lib
SUBDIR+= loader
.include <bsd.subdir.mk>

View File

@ -0,0 +1,6 @@
# Options used when building app-specific libalpha components
LOAD_ADDRESS= 0xffffffff80900000
DPADD+= ${DESTDIR}/${LIBDIR}/libstand.a
LIBSTANDDIR= ${.CURDIR}/../../../../lib/libstand
LIBSTAND= -lstand
LIBARC= ${.OBJDIR}/../lib/libarc.a

View File

@ -0,0 +1,199 @@
/*
* Copyright (c) 1999, Stefan Esser <se@freebsd.org>
* 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 unmodified, 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.
*
* $Id$
*
*/
#ifdef __GNUC__
#define INLINE inline
#else
#define INLINE /**/
#endif
/* System Parameter Block holding ARC and VENDOR function vector addresses */
#define SPBlock ((SPB *)0xffffffff806fe000ul)
/*
* Convert between 32bit (ARC) and 64bit (Alpha) pointers
*/
static INLINE void*
ptr(arcptr p)
{
return (void*)(int64_t)p.adr;
}
static INLINE arcptr
toarcptr(void *p)
{
arcptr p32;
p32.adr = (int32_t)(int64_t) p;
return (p32);
}
/*
* Return entry point for ARC BIOS function "funcno"
*/
static INLINE void *
get_arc_vector(int funcno)
{
arcptr (*arc_vector)[] = ptr(SPBlock->FirmwareVectorP);
return ptr((*arc_vector)[funcno -1]);
}
/*
* Return entry point for VENDOR function "funcno"
*/
static INLINE void *
get_vendor_vector(int funcno)
{
arcptr (*arc_vector)[] = ptr(SPBlock->PrivateVectorP);
return ptr((*arc_vector)[funcno -1]);
}
static INLINE int
get_vendor_vector_length(void)
{
return SPBlock->PrivateVectorLength;
}
/*
* Macros to create inline wrappers for ARCS BIOS functions
*
* Parameter:
* num function number (starting at 1)
* result result type
* fn function name
* param parameter list (types and formal args)
* args parameter list (formal args only)
*/
#define ARC_FN(num,result,fn,param,args) \
static inline result fn param { \
typedef result _fn_t param; \
_fn_t *p_ ## fn = get_arc_vector(num); \
return p_ ## fn args; \
}
#define VND_FN(num,result,fn,param,args) \
static INLINE result fn param { \
typedef result _fn_t param; \
_fn_t *p_ ## fn = get_vendor_vector(num); \
return p_ ## fn args; \
}
/* function codes as defined in ARC Specification Version 1.2 */
ARC_FN(1, int32_t, Load,
(char *Path, u_int32_t TopAddr, u_int32_t *ExecAddr, u_int32_t *LowAddr),
(Path, TopAddr, ExecAddr, LowAddr))
ARC_FN(2, int32_t, Invoke,
(u_int32_t ExecAddr, u_int32_t StackAddr, u_int32_t Argc, char *Argv[], char *Envp[]),
(ExecAddr, StackAddr, Argc, Argv, Envp))
ARC_FN(3, int32_t, Execute,
(char *Path, u_int32_t Argc, char *Argv[], char *Envp[]),
(Path, Argc, Argv, Envp))
ARC_FN(4, void, Halt, (void), ())
ARC_FN(5, void, PowerDown, (void), ())
ARC_FN(6, void, Restart, (void), ())
ARC_FN(7, void, FwReboot, (void), ())
ARC_FN(8, void, EnterInteractiveMode, (void), ())
ARC_FN(10, CONFIGURATION_COMPONENT *, GetPeer,
(CONFIGURATION_COMPONENT *Current),
(Current))
ARC_FN(11, CONFIGURATION_COMPONENT *, GetChild,
(CONFIGURATION_COMPONENT *Current),
(Current))
ARC_FN(12, CONFIGURATION_COMPONENT *, GetParent,
(CONFIGURATION_COMPONENT *Current),
(Current))
ARC_FN(13, CONFIGURATION_COMPONENT *, AddChild,
(CONFIGURATION_COMPONENT *Current, CONFIGURATION_COMPONENT *Template,
void *ConfigurationData),
(Current, Template, ConfigurationData))
ARC_FN(14, int32_t, DeleteComponent,
(CONFIGURATION_COMPONENT *ComponentToDelete),
(ComponentToDelete))
ARC_FN(15, CONFIGURATION_COMPONENT *, GetComponent, (char *Path), (Path))
ARC_FN(16, int32_t, GetConfigurationData,
(void *ConfigurationData, CONFIGURATION_COMPONENT *Component),
(ConfigurationData, Component))
ARC_FN(17, int32_t, SaveConfiguration, (void), ())
ARC_FN(18, SYSTEM_ID *, GetSystemId, (void), ())
ARC_FN(19, MEMORY_DESCRIPTOR *, GetMemoryDescriptor,
(MEMORY_DESCRIPTOR *Current),
(Current))
ARC_FN(21, TIME_FIELDS *, GetTime, (void), ())
ARC_FN(22, u_int32_t, GetRelativeTime, (void), ())
ARC_FN(23, int32_t, GetDirectoryEntry,
(u_int32_t FileId, DIRECTORY_ENTRY *Buffer, u_int32_t Length, u_int32_t *Count),
(FileId, Buffer, Length, Count))
ARC_FN(24, int32_t, Open,
(const char *Path, OPEN_MODE OpenMode, u_int32_t *FileId),
(Path, OpenMode, FileId))
ARC_FN(25, int32_t, Close, (u_int32_t FileId), (FileId))
ARC_FN(26, int32_t, Read,
(u_int32_t FileId, void *Buffer, u_int32_t N, u_int32_t *Count),
(FileId, Buffer, N, Count))
ARC_FN(27, int32_t, GetReadStatus, (u_int32_t FileId), (FileId))
ARC_FN(28, int32_t, Write,
(u_int32_t FileId, void const *Buffer, u_int32_t N, u_int32_t *Count),
(FileId, Buffer, N, Count))
ARC_FN(29, int32_t, Seek,
(u_int32_t FileId, fpos_t *Position, SEEK_MODE SeekMode),
(FileId, Position, SeekMode))
ARC_FN(30, int32_t, Mount,
(char *Path, MOUNT_OPERATION Operation),
(Path, Operation))
ARC_FN(31, char *, GetEnvironmentVariable, (char *Name), (Name))
ARC_FN(32, int32_t, SetEnvironmentVariable,
(char *Name, char *Value),
(Name, Value))
ARC_FN(33, int32_t, GetFileInformation,
(u_int32_t FileId, FILE_INFORMATION *Information),
(FileId, Information))
ARC_FN(34, int32_t, SetFileInformation,
(u_int32_t FileId, u_int32_t AttributeFlags, u_int32_t AttributeMask),
(FileId, AttributeFlags, AttributeMask))
ARC_FN(35, void, FlushAllCaches, (void), ())
ARC_FN(36, int32_t, TestUnicodeCharacter,
(u_int32_t FileId, WCHAR UnicodeCharacter),
(FileId, UnicodeCharacter))
ARC_FN(37, ARC_DISPLAY_STATUS *, GetDisplayStatus, (u_int32_t FileId), (FileId))
/* Vendor specific function codes have not been verified beyond function 4 */
VND_FN(1, void *, AllocatePool, (u_int32_t NumberOfBytes), (NumberOfBytes))
VND_FN(2, void, StallExecution, (u_int32_t Microseconds), (Microseconds))
VND_FN(3, u_int32_t, Print,
(char *Format, int32_t Arg1, int32_t Arg2, int32_t Arg3),
(Format, Arg1, Arg2, Arg3))
VND_FN(4, void, ReturnExtendedSystemInformation,
(EXTENDED_SYSTEM_INFORMATION *SystemInfo),
(SystemInfo))

View File

@ -0,0 +1,288 @@
/*
* Copyright (c) 1999, Stefan Esser <se@freebsd.org>
* 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 unmodified, 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.
*
* $Id$
*
*/
#ifndef _ARC_TYPES_H_
#define _ARC_TYPES_H_
#define ESUCCESS 0
typedef u_int8_t BOOLEAN;
typedef u_int16_t WCHAR;
typedef int64_t fpos_t;
/* XXX the following types are defined in ARC but are not currently used */
#if 0
typedef void VOID;
typedef int8_t CHAR;
typedef int16_t SHORT;
typedef int32_t LONG;
typedef int64_t LONGLONG;
typedef u_int8_t UCHAR;
typedef u_int16_t USHORT;
typedef u_int32_t ULONG;
typedef u_int64_t ULONGLONG;
/*
* The following ARC types conflict with <sys/types.h> !
* They are not used in the ARC wrapper functions or ARC structs
* currently, and thus may be left alone for now. In case the
* wrappers or structs are converted to use them, it is suggested
* to prefix them with "arc" to avoid type clashes (if linking
* against libstand.a which expects the FreeBSD declarations).
*/
typedef u_int32_t size_t;
typedef int64_t clock_t;
typedef int64_t off_t;
typedef int32_t time_t;
#endif /* 0 */
typedef struct {
int32_t adr;
} arcptr;
typedef struct {
u_int32_t SPBSignature;
u_int32_t SPBLength;
u_int16_t Version;
u_int16_t Revision;
arcptr RestartBlockP;
arcptr DebugBlockP;
arcptr GEVectorP;
arcptr ULTBMissVectorP;
u_int32_t FirmwareVectorLength;
arcptr FirmwareVectorP;
u_int32_t PrivateVectorLength;
arcptr PrivateVectorP;
u_int32_t AdapterCount;
struct {
u_int32_t AdapterType;
u_int32_t AdapterVectorLength;
arcptr AdapterVectorP;
} Adapters[1];
} SPB;
/* ARC function specific data types */
typedef enum{
SystemClass,
ProcessorClass,
CacheClass,
AdapterClass,
ControllerClass,
PeripheralClass,
MemoryClass,
MaximumClass
} CONFIGURATION_CLASS;
typedef enum {
ArcSystem,
CentralProcessor,
FloatingPointProcessor,
PrimaryIcache,
PrimaryDcache,
SecondaryIcache,
SecondaryDcache,
SecondaryCache,
EisaAdapter,
TcAdapter,
ScsiAdapter,
DtiAdapter,
MultiFunctionAdapter,
DiskController,
TapeController,
CdromController,
WormController,
SerialController,
NetworkController,
DisplayController,
ParallelController,
PointerController,
KeyboardController,
AudioController,
OtherController,
DiskPeripheral,
FloppyDiskPeripheral,
TapePeripheral,
ModemPeripheral,
MonitorPeripheral,
PrinterPeripheral,
PointerPeripheral,
KeyboardPeripheral,
TerminalPeripheral,
OtherPeripheral,
LinePeripheral,
NetworkPeripheral,
SystemMemory,
MaximumType
} CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
typedef enum {
Failed = 0x01,
ReadOnly = 0x02,
Removable = 0x04,
ConsoleIn = 0x08,
ConsoleOut = 0x10,
Input = 0x20,
Output = 0x40
} IDENTIFIERFLAG;
typedef struct {
CONFIGURATION_CLASS Class;
CONFIGURATION_TYPE Type;
IDENTIFIERFLAG Flags;
u_int16_t Version;
u_int16_t Revision;
u_int32_t Key;
u_int32_t AffinityMask;
u_int32_t ConfigurationDataLength;
u_int32_t IdentifierLength;
arcptr Identifier;
} CONFIGURATION_COMPONENT, *PCONFIGURATION_COMPONENT;
typedef struct {
int8_t VendorId[8];
int8_t ProductId[8];
} SYSTEM_ID;
typedef enum {
MemoryExceptionBlock,
MemorySystemBlock,
MemoryFree,
MemoryBad,
MemoryLoadedProgram,
MemoryFirmwareTemporary,
MemoryFirmwarePermanent,
MemoryFreeContiguous,
MemorySpecialMemory,
MemoryMaximum
} MEMORY_TYPE;
typedef struct {
MEMORY_TYPE Type;
u_int32_t BasePage;
u_int32_t PageCount;
} MEMORY_DESCRIPTOR;
typedef struct _TIME_FIELDS{
u_int16_t Year; /* 1601 .. */
u_int16_t Month; /* 1 .. 12 */
u_int16_t Day; /* 1 .. 31 */
u_int16_t Hour; /* 0 .. 23 */
u_int16_t Minute; /* 0 .. 59 */
u_int16_t Second; /* 0 .. 59 */
u_int16_t Milliseconds; /* 0 .. 999 */
u_int16_t Weekday; /* 0 .. 6 = Sunday .. Saturday */
} TIME_FIELDS, *PTIME_FIELDS;
#define StandardIn 0
#define StandardOut 1
#define ReadOnlyFile 0x01
#define HiddenFile 0x02
#define SystemFile 0x04
#define ArchiveFile 0x08
#define DirectoryFile 0x10
#define DeleteFile 0x20
typedef struct {
u_int32_t FileNameLength;
u_int8_t FileAttribute;
int8_t FileName[32];
} DIRECTORY_ENTRY;
typedef enum {
OpenReadOnly,
OpenWriteOnly,
OpenReadWrite,
CreateWriteOnly,
CreateReadWrite,
SupersedeWriteOnly,
SupersedeReadWrite,
OpenDirectory,
CreateDirectory,
OpenMaximumMode
} OPEN_MODE;
typedef enum {
SeekAbsolute,
SeekRelative,
SeekMaximum
} SEEK_MODE;
typedef enum {
MountLoadMedia,
MountUnloadMedia,
MountMaximum
} MOUNT_OPERATION;
typedef struct {
fpos_t StartingAddress;
fpos_t EndingAddress;
fpos_t CurrentAddress;
CONFIGURATION_TYPE Type;
u_int32_t FileNameLength;
u_int8_t Attributes;
int8_t FileName[32];
} FILE_INFORMATION;
typedef struct {
u_int16_t CursorXPosition;
u_int16_t CursorYPosition;
u_int16_t CursorMaxXPosition;
u_int16_t CursorMaxYPosition;
u_int8_t ForegroundColor;
u_int8_t BackgroundColor;
BOOLEAN HighIntensity;
BOOLEAN Underscored;
BOOLEAN ReverseVideo;
} ARC_DISPLAY_STATUS;
/* vendor function specific data types */
typedef struct {
u_int32_t ProcessorId;
u_int32_t ProcessorRevision;
u_int32_t ProcessorPageSize;
u_int32_t NumberOfPhysicalAddressBits;
u_int32_t MaximumAddressSpaceNumber;
u_int32_t ProcessorCycleCounterPeriod;
u_int32_t SystemRevision;
u_int8_t SystemSerialNumber[16];
u_int8_t FirmwareVersion[16];
u_int8_t FirmwareBuildTimeStamp[12];
} EXTENDED_SYSTEM_INFORMATION, *PEXTENDED_SYSTEM_INFORMATION;
#endif /* _ARC_TYPES_H_ */

View File

@ -0,0 +1,81 @@
/* $Id$ */
/*
* Copyright (c) 1996
* Matthias Drochner. 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.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed for the NetBSD Project
* by Matthias Drochner.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* 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.
*
*/
/*
* ARC fully-qualified device descriptor
*/
struct arc_devdesc
{
struct devsw *d_dev;
int d_type;
#define DEVT_NONE 0
#define DEVT_DISK 1
#define DEVT_NET 2
union
{
struct
{
int unit;
int slice;
int partition;
} arcdisk;
struct
{
int unit; /* XXX net layer lives over these? */
} netif;
} d_kind;
};
extern int arc_getdev(void **vdev, const char *devspec, const char **path);
extern char *arc_fmtdev(void *vdev);
extern int arc_setcurrdev(struct env_var *ev, int flags, void *value);
#define MAXDEV 31 /* maximum number of distinct devices */
typedef unsigned long physaddr_t;
/* exported devices XXX rename? */
extern struct devsw arcdisk;
extern struct netif_driver arcnet;
/* this is in startup code */
extern void delay(int);
extern void reboot(void);
extern int arc_copyin(void *src, vm_offset_t dest, size_t len);
extern int arc_copyout(vm_offset_t src, void *dest, size_t len);
extern int arc_readin(int fd, vm_offset_t dest, size_t len);
extern int arc_boot(void);
extern int arc_autoload(void);

38
sys/boot/arc/lib/Makefile Normal file
View File

@ -0,0 +1,38 @@
# $Id: Makefile,v 1.6 1998/10/16 19:26:11 msmith Exp $
LIB= arc
NOPIC= true
NOPROFILE= true
INTERNALLIB= true
.PATH: arch/${MACHINE}
# XXX hack to pick up stand.h
LIBSTANDDIR= ${.CURDIR}/../../../../lib/libstand
CFLAGS= -I${LIBSTANDDIR}
CFLAGS+= -DDEBUG
# Pick up the bootstrap header for some interface items
CFLAGS+= -I${.CURDIR}/../../common -mno-fp-regs \
-I${.CURDIR}/../../.. -I../include
#CFLAGS+= -DDISK_DEBUG
#CPPFLAGS+= -DNO_DISKLABEL
#CPPFLAGS+= -DSAVE_MEMORY
SRCS= delay.c time.c abort.c setjmperr.c copy.c devicename.c module.c \
arcconsole.c arcdisk.c elf_freebsd.c bootinfo.c
.if ${MACHINE} == "alpha"
SRCS+= rpb.c
.endif
all: libarc.a
CLEANFILES+= machine
machine:
ln -sf ${.CURDIR}/../../../alpha/include machine
.include <bsd.lib.mk>
beforedepend ${OBJS}: machine

38
sys/boot/arc/lib/abort.c Normal file
View File

@ -0,0 +1,38 @@
/*-
* Copyright (c) 1998 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.
*
* $Id$
*/
#include <errno.h>
#include <sys/types.h>
#include "arctypes.h"
#include "arcfuncs.h"
void
abort()
{
FwReboot();
}

View File

@ -0,0 +1,107 @@
/* $Id$ */
/* $NetBSD: prom.c,v 1.3 1997/09/06 14:03:58 drochner Exp $ */
/*
* Mach Operating System
* Copyright (c) 1992 Carnegie Mellon University
* All Rights Reserved.
*
* Permission to use, copy, modify and distribute this software and its
* documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
*
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
*
* Carnegie Mellon requests users of this software to return to
*
* Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
*
* any improvements or extensions that they make and grant Carnegie Mellon
* the rights to redistribute these changes.
*/
#include <sys/types.h>
#include "bootstrap.h"
#include "arctypes.h"
#include "arcfuncs.h"
int console;
static void arc_probe(struct console *cp);
static int arc_init(int);
static void arc_putchar(int);
static int arc_getchar(void);
static int arc_poll(void);
struct console arcconsole = {
"arc",
"ARC firmware console",
0,
arc_probe,
arc_init,
arc_putchar,
arc_getchar,
arc_poll,
};
static void
arc_probe(struct console *cp)
{
cp->c_flags |= C_PRESENTIN|C_PRESENTOUT;
}
static int
arc_init(int arg)
{
return 0;
}
static void
arc_putchar(int c)
{
char cbuf = c;
u_int32_t count;
Write(StandardOut, &cbuf, 1, &count);
}
static int saved_char = -1;
int
arc_getchar()
{
char cbuf;
u_int32_t count;
arc_putchar('_');
arc_putchar('\b');
Read(StandardIn, &cbuf, 1, &count);
arc_putchar(' ');
arc_putchar('\b');
if (count == 1)
return cbuf;
else
return -1;
}
int
arc_poll()
{
return GetReadStatus(StandardIn) == ESUCCESS;
}
int
arc_open(dev, len)
char *dev;
int len;
{
return 0;
}

357
sys/boot/arc/lib/arcdisk.c Normal file
View File

@ -0,0 +1,357 @@
/*-
* Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
* Copyright (c) 1998 Doug Rabson <dfr@freebsd.org>
* 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.
*
* $Id$
*/
/*
* ARC disk device handling.
*
* Ideas and algorithms from:
*
* - NetBSD libi386/biosdisk.c
* - FreeBSD biosboot/disk.c
*
* XXX Todo: add bad144 support.
*/
#include <stand.h>
#include <sys/disklabel.h>
#include <sys/diskslice.h>
#include <machine/stdarg.h>
#include "bootstrap.h"
#include "libarc.h"
#include "arctypes.h"
#include "arcfuncs.h"
#define ARCDISK_SECSIZE 512
#define BUFSIZE (1 * ARCDISK_SECSIZE)
#define MAXBDDEV MAXDEV
#ifdef DISK_DEBUG
# define D(x) x
#else
# define D(x)
#endif
static int bd_init(void);
static int bd_strategy(void *devdata, int flag, daddr_t dblk, size_t size, void *buf, size_t *rsize);
static int bd_realstrategy(void *devdata, int flag, daddr_t dblk, size_t size, void *buf, size_t *rsize);
static int bd_open(struct open_file *f, void *vdev);
static int bd_close(struct open_file *f);
static void bd_print(int verbose);
struct open_disk {
int od_fd;
int od_unit; /* our unit number */
int od_boff; /* block offset from beginning of ARC disk */
int od_flags;
#define BD_FLOPPY (1<<2)
u_char od_buf[BUFSIZE]; /* transfer buffer (do we want/need this?) */
};
struct devsw arcdisk = {
"disk",
DEVT_DISK,
bd_init,
bd_strategy,
bd_open,
bd_close,
noioctl,
bd_print
};
/*
* List of ARC devices, translation from disk unit number to
* ARC unit number.
*/
static struct
{
char bd_name[64];
int bd_unit; /* ARC unit number */
int bd_namelen;
int bd_flags;
} bdinfo [MAXBDDEV];
static int nbdinfo = 0;
/*
* Quiz ARC for disk devices, save a little info about them.
*/
static int
bd_init(void)
{
nbdinfo++;
return (0);
}
/*
* Print information about disks
*/
static void
bd_print(int verbose)
{
int i;
char line[80];
for (i = 0; i < nbdinfo; i++) {
sprintf(line, " disk%d: ARC drive %s", i, bdinfo[i].bd_name);
pager_output(line);
/* XXX more detail? */
pager_output("\n");
}
}
/*
* Attempt to open the disk described by (dev) for use by (f).
*
* Note that the philosophy here is "give them exactly what
* they ask for". This is necessary because being too "smart"
* about what the user might want leads to complications.
* (eg. given no slice or partition value, with a disk that is
* sliced - are they after the first BSD slice, or the DOS
* slice before it?)
*/
static int
bd_open(struct open_file *f, void *vdev)
{
struct arc_devdesc *dev = vdev;
struct dos_partition *dptr;
struct open_disk *od;
struct disklabel *lp;
int sector, slice, i;
int error;
int unit;
u_int32_t fd;
unit = dev->d_kind.arcdisk.unit;
if (unit >= nbdinfo) {
D(printf("attempt to open nonexistent disk\n"));
return(ENXIO);
}
if (Open("scsi(0)disk(0)rdisk(0)partition(0)",
OpenReadOnly, &fd) != ESUCCESS)
if (Open("scsi(0)disk(1)rdisk(0)partition(0)",
OpenReadOnly, &fd) != ESUCCESS)
if (Open("multi(0)disk(0)fdisk(0)partition(0)",
OpenReadOnly, &fd) != ESUCCESS)
return(ENXIO);
od = (struct open_disk *) malloc(sizeof(struct open_disk));
if (!od) {
D(printf("arcdiskopen: no memory\n"));
return (ENOMEM);
}
/* Look up ARC unit number, intialise open_disk structure */
od->od_fd = fd;
od->od_unit = dev->d_kind.arcdisk.unit;
od->od_flags = bdinfo[od->od_unit].bd_flags;
od->od_boff = 0;
error = 0;
#if 0
/* Get geometry for this open (removable device may have changed) */
if (set_geometry(&od->od_ll)) {
D(printf("bd_open: can't get geometry\n"));
error = ENXIO;
goto out;
}
#endif
/*
* Following calculations attempt to determine the correct value
* for d->od_boff by looking for the slice and partition specified,
* or searching for reasonable defaults.
*/
#if 0
/*
* Find the slice in the DOS slice table.
*/
if (readsects(&od->od_ll, 0, 1, od->od_buf, 0)) {
D(printf("bd_open: error reading MBR\n"));
error = EIO;
goto out;
}
/*
* Check the slice table magic.
*/
if ((od->od_buf[0x1fe] != 0xff) || (od->od_buf[0x1ff] != 0xaa)) {
/* If a slice number was explicitly supplied, this is an error */
if (dev->d_kind.arcdisk.slice > 0) {
D(printf("bd_open: no slice table/MBR (no magic)\n"));
error = ENOENT;
goto out;
}
sector = 0;
goto unsliced; /* may be a floppy */
}
dptr = (struct dos_partition *) & od->od_buf[DOSPARTOFF];
/*
* XXX No support here for 'extended' slices
*/
if (dev->d_kind.arcdisk.slice <= 0) {
/*
* Search for the first FreeBSD slice; this also works on "unsliced"
* disks, as they contain a "historically bogus" MBR.
*/
for (i = 0; i < NDOSPART; i++, dptr++)
if (dptr->dp_typ == DOSPTYP_386BSD) {
sector = dptr->dp_start;
break;
}
/* Did we find something? */
if (sector == -1) {
error = ENOENT;
goto out;
}
} else {
/*
* Accept the supplied slice number unequivocally (we may be looking
* for a DOS partition) if we can handle it.
*/
if ((dev->d_kind.arcdisk.slice > NDOSPART) || (dev->d_kind.arcdisk.slice < 1)) {
error = ENOENT;
goto out;
}
dptr += (dev->d_kind.arcdisk.slice - 1);
sector = dptr->dp_start;
}
unsliced:
#else
sector = 0;
#endif
/*
* Now we have the slice, look for the partition in the disklabel if we have
* a partition to start with.
*/
if (dev->d_kind.arcdisk.partition < 0) {
od->od_boff = sector; /* no partition, must be after the slice */
} else {
if (bd_strategy(od, F_READ, sector + LABELSECTOR, 512, od->od_buf, 0)) {
D(printf("bd_open: error reading disklabel\n"));
error = EIO;
goto out;
}
lp = (struct disklabel *) (od->od_buf + LABELOFFSET);
if (lp->d_magic != DISKMAGIC) {
D(printf("bd_open: no disklabel\n"));
error = ENOENT;
goto out;
} else if (dev->d_kind.arcdisk.partition >= lp->d_npartitions) {
/*
* The partition supplied is out of bounds; this is fatal.
*/
D(printf("partition '%c' exceeds partitions in table (a-'%c')\n",
'a' + dev->d_kind.arcdisk.partition, 'a' + lp->d_npartitions));
error = EPART;
goto out;
} else {
/*
* Complain if the partition type is wrong and it shouldn't be, but
* regardless accept this partition.
*/
D(if ((lp->d_partitions[dev->d_kind.arcdisk.partition].p_fstype == FS_UNUSED) &&
!(od->od_flags & BD_FLOPPY)) /* Floppies often have bogus fstype */
printf("bd_open: warning, partition marked as unused\n"););
od->od_boff = lp->d_partitions[dev->d_kind.arcdisk.partition].p_offset;
}
}
/*
* Save our context
*/
f->f_devdata = od;
out:
if (error)
free(od);
return(error);
}
static int
bd_close(struct open_file *f)
{
struct open_disk *od = f->f_devdata;
Close(od->od_fd);
free(od);
f->f_devdata = NULL;
return(0);
}
static int
bd_strategy(void *devdata, int rw, daddr_t dblk, size_t size, void *buf, size_t *rsize)
{
struct bcache_devdata bcd;
bcd.dv_strategy = bd_realstrategy;
bcd.dv_devdata = devdata;
return(bcache_strategy(&bcd, rw, dblk, size, buf, rsize));
}
static int
bd_realstrategy(void *devdata, int flag, daddr_t dblk, size_t size, void *buf, size_t *rsize)
{
struct open_disk *od = (struct open_disk *)devdata;
fpos_t seek;
u_int32_t count;
if (size % ARCDISK_SECSIZE)
panic("bd_strategy: I/O not block multiple");
if (flag != F_READ)
return(EROFS);
if (rsize)
*rsize = 0;
seek = 512 * (dblk + od->od_boff);
Seek(od->od_fd, &seek, SeekAbsolute);
if (Read(od->od_fd, buf, size, &count) != ESUCCESS) {
D(printf("read error\n"));
return (EIO);
}
if (rsize)
*rsize = count;
return (0);
}

View File

@ -0,0 +1,71 @@
/*-
* Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
* 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.
*
* $Id: alpha_copy.c,v 1.3 1998/09/20 21:46:19 dfr Exp $
*/
/*
* MD primitives supporting placement of module data
*
* XXX should check load address/size against memory top.
*/
#include <stand.h>
#include <machine/alpha_cpu.h>
#include "libarc.h"
/*
* Convert from a 64bit superpage address to a 32bit arc superpage address.
*/
static void *
convert_superpage(vm_offset_t p)
{
if (p < ALPHA_K0SEG_BASE || p >= ALPHA_K0SEG_END) {
printf("stupid address %p\n", (void *)p);
panic("broken");
}
return (void *) (0xffffffff80000000 + (p - ALPHA_K0SEG_BASE));
}
int
arc_copyin(void *src, vm_offset_t dest, size_t len)
{
bcopy(src, convert_superpage(dest), len);
return(len);
}
int
arc_copyout(vm_offset_t src, void *dest, size_t len)
{
bcopy(convert_superpage(src), dest, len);
return(len);
}
int
arc_readin(int fd, vm_offset_t dest, size_t len)
{
return(read(fd, convert_superpage(dest), len));
}

View File

@ -0,0 +1,196 @@
/*-
* Copyright (c) 1998 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.
*
* $Id$
*/
#include <stand.h>
#include <machine/rpb.h>
#include "arctypes.h"
#include "arcfuncs.h"
struct rpb RPB = {
0, /* rpb_phys */
{"HWRPB"}, /* rpb_magic */
HWRPB_DSRDB_MINVERS, /* rpb_version */
sizeof(struct rpb), /* rpb_size */
0, /* rpb_primary_cpu_id */
8192, /* rpb_page_size */
43, /* rpb_phys_addr_size */
0, /* rpb_max_asn */
{0}, /* rpb_ssn */
ST_EB164, /* rpb_type */
SV_ST_ALPHAPC164LX_533, /* rpb_variation */
{"0000"}, /* rpb_revision */
1024*4096, /* rpb_intr_freq */
533*1024*1024, /* rpb_cc_freq */
0, /* rpb_vptb */
0, /* rpb_reserved_arch */
0, /* rpb_tbhint_off */
0, /* rpb_pcs_cnt */
0, /* rpb_pcs_size */
0, /* rpb_pcs_off */
0, /* rpb_ctb_cnt */
0, /* rpb_ctb_size */
0, /* rpb_ctb_off */
0, /* rpb_crb_off */
0, /* rpb_memdat_off */
0, /* rpb_condat_off */
0, /* rpb_fru_off */
0, /* rpb_save_term */
0, /* rpb_save_term_val */
0, /* rpb_rest_term */
0, /* rpb_rest_term_val */
0, /* rpb_restart */
0, /* rpb_restart_val */
0, /* rpb_reserve_os */
0, /* rpb_reserve_hw */
0, /* rpb_checksum */
0, /* rpb_rxrdy */
0, /* rpb_txrdy */
0, /* rpb_dsrdb_off */
{0}, /* rpb_rpb_tbhint */
};
#define ROUNDUP(x) (((x) + sizeof(u_int64_t) - 1) \
& ~(sizeof(u_int64_t) - 1))
u_int64_t
checksum(void *p, size_t size)
{
u_int64_t sum = 0;
u_int64_t *lp = (u_int64_t *)p;
int i;
printf("checksum(%p, %d)\n", p, size);
size = ROUNDUP(size) / sizeof(u_int64_t);
for (i = 0; i < size; i++)
sum += lp[i];
}
size_t
size_mddt()
{
int count = 0;
MEMORY_DESCRIPTOR *desc;
for (desc = GetMemoryDescriptor(NULL); desc;
desc = GetMemoryDescriptor(desc)) {
count++;
}
return ROUNDUP(sizeof(struct mddt)
+ (count - 1) * sizeof(struct mddt_cluster));
}
void
write_mddt(struct mddt *mddt, size_t size)
{
int count = 0, i;
MEMORY_DESCRIPTOR *desc;
u_int64_t *p;
memset(mddt, 0, sizeof(struct mddt));
for (desc = GetMemoryDescriptor(NULL); desc;
desc = GetMemoryDescriptor(desc)) {
struct mddt_cluster *mc;
mc = &mddt->mddt_clusters[count];
mc->mddt_pfn = desc->BasePage;
mc->mddt_pg_cnt = desc->PageCount;
mc->mddt_pg_test = 0;
mc->mddt_v_bitaddr = 0;
mc->mddt_p_bitaddr = 0;
mc->mddt_bit_cksum = 0;
/*
* Not sure about the FirmwareTemporary bit but my 164LX has
* about 60Mb marked this way.
*/
if (desc->Type == MemoryFree || desc->Type == MemoryFirmwareTemporary)
mc->mddt_usage = MDDT_SYSTEM;
else if (desc->Type == MemorySpecialMemory)
mc->mddt_usage = MDDT_NONVOLATILE; /* ?? */
else
mc->mddt_usage = MDDT_PALCODE;
count++;
}
mddt->mddt_cluster_cnt = count;
mddt->mddt_cksum = checksum(mddt, size);
}
size_t
size_rpb()
{
return sizeof(struct rpb) + size_mddt();
}
void
write_rpb(struct rpb *rpb)
{
EXTENDED_SYSTEM_INFORMATION sysinfo;
SYSTEM_ID *sysid;
ReturnExtendedSystemInformation(&sysinfo);
memset(rpb, 0, sizeof(struct rpb));
rpb->rpb_phys = 0; /* XXX */
strcpy(rpb->rpb_magic, "HWRPB");
rpb->rpb_version = HWRPB_DSRDB_MINVERS;
rpb->rpb_size = sizeof(struct rpb);
rpb->rpb_primary_cpu_id = 0; /* XXX */
rpb->rpb_page_size = sysinfo.ProcessorPageSize;
rpb->rpb_phys_addr_size = sysinfo.NumberOfPhysicalAddressBits;
rpb->rpb_max_asn = sysinfo.MaximumAddressSpaceNumber;
rpb->rpb_type = ST_EB164; /* XXX */
rpb->rpb_variation = SV_ST_ALPHAPC164LX_533; /* XXX */
rpb->rpb_intr_freq = 1024*4096; /* XXX */
rpb->rpb_cc_freq = 533000000; /* XXX */
rpb->rpb_memdat_off = sizeof(struct rpb);
write_mddt((struct mddt *)((caddr_t) rpb + rpb->rpb_memdat_off),
size_mddt());
rpb->rpb_checksum = checksum(rpb, 280); /* only sum first 280 bytes */
}
struct rpb *
make_rpb()
{
EXTENDED_SYSTEM_INFORMATION sysinfo;
struct rpb *rpb;
ReturnExtendedSystemInformation(&sysinfo);
printf("sysinfo.ProcessorId = %x\n", sysinfo.ProcessorId);
printf("sysinfo.ProcessorRevision = %d\n", sysinfo.ProcessorRevision);
printf("sysinfo.ProcessorPageSize = %d\n", sysinfo.ProcessorPageSize);
printf("sysinfo.NumberOfPhysicalAddressBits = %d\n", sysinfo.NumberOfPhysicalAddressBits);
printf("sysinfo.MaximumAddressSpaceNumber = %d\n", sysinfo.MaximumAddressSpaceNumber);
printf("sysinfo.ProcessorCycleCounterPeriod = %d\n", sysinfo.ProcessorCycleCounterPeriod);
printf("sysinfo.SystemRevision = %d\n", sysinfo.SystemRevision);
printf("sysinfo.SystemSerialNumber = %s\n", sysinfo.SystemSerialNumber);
printf("sysinfo.FirmwareVersion = %s\n", sysinfo.FirmwareVersion);
rpb = malloc(size_rpb());
write_rpb(rpb);
return rpb;
}

View File

@ -0,0 +1,95 @@
/* $Id$ */
/*
* Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
* All rights reserved.
*
* Author: Chris G. Demetriou
*
* Permission to use, copy, modify and distribute this software and
* its documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
*
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
* FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
*
* Carnegie Mellon requests users of this software to return to
*
* Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
*
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*/
#include <machine/asm.h>
.text
/*
* Kernel setjmp and longjmp. Rather minimalist.
*
* longjmp(label_t *a)
* will generate a "return (1)" from the last call to
* setjmp(label_t *a)
* by restoring registers from the stack,
*/
.set noreorder
LEAF(setjmp, 1)
LDGP(pv)
stq ra, (0 * 8)(a0) /* return address */
stq s0, (1 * 8)(a0) /* callee-saved registers */
stq s1, (2 * 8)(a0)
stq s2, (3 * 8)(a0)
stq s3, (4 * 8)(a0)
stq s4, (5 * 8)(a0)
stq s5, (6 * 8)(a0)
stq s6, (7 * 8)(a0)
stq sp, (8 * 8)(a0)
ldiq t0, 0xbeeffedadeadbabe /* set magic number */
stq t0, (9 * 8)(a0)
mov zero, v0 /* return zero */
RET
END(setjmp)
LEAF(longjmp, 1)
LDGP(pv)
ldiq t0, 0xbeeffedadeadbabe /* check magic number */
ldq t1, (9 * 8)(a0)
cmpeq t0, t1, t0
beq t0, longjmp_botch /* if bad, punt */
ldq ra, (0 * 8)(a0) /* return address */
ldq s0, (1 * 8)(a0) /* callee-saved registers */
ldq s1, (2 * 8)(a0)
ldq s2, (3 * 8)(a0)
ldq s3, (4 * 8)(a0)
ldq s4, (5 * 8)(a0)
ldq s5, (6 * 8)(a0)
ldq s6, (7 * 8)(a0)
ldq sp, (8 * 8)(a0)
ldiq v0, 1
RET
longjmp_botch:
lda a0, longjmp_botchmsg
mov ra, a1
CALL(panic)
call_pal PAL_bugchk
.data
longjmp_botchmsg:
.asciz "longjmp botch from %p"
.text
END(longjmp)

View File

@ -0,0 +1,63 @@
/*
* Copyright (c) 1999, Stefan Esser <se@freebsd.org>
* 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 unmodified, 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.
*
* $Id$
*
*/
/*
* Based on /sys/boot/alpha/libalpha/start.S
* Copyright (c) 1992 Carnegie Mellon University
*/
#include <machine/asm.h>
.text
#define ENTRY_FRAME 32
NESTED(_start, 1, ENTRY_FRAME, ra, 0, 0)
br pv,Lstartgp
Lstartgp:
LDGP(pv)
lda a0,_edata
lda a1,_end
subq a1,a0,a1
CALL(bzero)
lda sp, -8(sp)
stq ra, 0(sp)
CALL(main) /* transfer to C */
ldq ra, 0(sp)
lda sp, 8(sp)
RET /* XXX */
XLEAF(_rtt, 0)
XLEAF(halt, 0)
call_pal PAL_halt /* halt if we ever return */
END(_start)

204
sys/boot/arc/lib/bootinfo.c Normal file
View File

@ -0,0 +1,204 @@
/*-
* Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
* 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.
*
* $Id: bootinfo.c,v 1.3 1998/10/15 21:55:58 dfr Exp $
*/
#include <stand.h>
#include <string.h>
#include <sys/param.h>
#include <sys/reboot.h>
#include <sys/linker.h>
#include <machine/elf.h>
#include <machine/prom.h>
#include <machine/rpb.h>
#include <machine/bootinfo.h>
#include "bootstrap.h"
/*
* Copy the environment into the load area starting at (addr).
* Each variable is formatted as <name>=<value>, with a single nul
* separating each variable, and a double nul terminating the environment.
*/
vm_offset_t
bi_copyenv(vm_offset_t addr)
{
struct env_var *ep;
/* traverse the environment */
for (ep = environ; ep != NULL; ep = ep->ev_next) {
alpha_copyin(ep->ev_name, addr, strlen(ep->ev_name));
addr += strlen(ep->ev_name);
alpha_copyin("=", addr, 1);
addr++;
if (ep->ev_value != NULL) {
alpha_copyin(ep->ev_value, addr, strlen(ep->ev_value));
addr += strlen(ep->ev_value);
}
alpha_copyin("", addr, 1);
addr++;
}
alpha_copyin("", addr, 1);
addr++;
return(addr);
}
/*
* Copy module-related data into the load area, where it can be
* used as a directory for loaded modules.
*
* Module data is presented in a self-describing format. Each datum
* is preceeded by a 32-bit identifier and a 32-bit size field.
*
* Currently, the following data are saved:
*
* MOD_NAME (variable) module name (string)
* MOD_TYPE (variable) module type (string)
* MOD_ADDR sizeof(vm_offset_t) module load address
* MOD_SIZE sizeof(size_t) module size
* MOD_METADATA (variable) type-specific metadata
*/
#define COPY32(v, a) { \
u_int32_t x = (v); \
alpha_copyin(&x, a, sizeof(x)); \
a += sizeof(x); \
}
#define MOD_STR(t, a, s) { \
COPY32(t, a); \
COPY32(strlen(s) + 1, a); \
alpha_copyin(s, a, strlen(s) + 1); \
a += roundup(strlen(s) + 1, sizeof(u_int64_t));\
}
#define MOD_NAME(a, s) MOD_STR(MODINFO_NAME, a, s)
#define MOD_TYPE(a, s) MOD_STR(MODINFO_TYPE, a, s)
#define MOD_VAR(t, a, s) { \
COPY32(t, a); \
COPY32(sizeof(s), a); \
alpha_copyin(&s, a, sizeof(s)); \
a += roundup(sizeof(s), sizeof(u_int64_t)); \
}
#define MOD_ADDR(a, s) MOD_VAR(MODINFO_ADDR, a, s)
#define MOD_SIZE(a, s) MOD_VAR(MODINFO_SIZE, a, s)
#define MOD_METADATA(a, mm) { \
COPY32(MODINFO_METADATA | mm->md_type, a); \
COPY32(mm->md_size, a); \
alpha_copyin(mm->md_data, a, mm->md_size); \
a += roundup(mm->md_size, sizeof(u_int64_t));\
}
#define MOD_END(a) { \
COPY32(MODINFO_END, a); \
COPY32(0, a); \
}
vm_offset_t
bi_copymodules(vm_offset_t addr)
{
struct loaded_module *mp;
struct module_metadata *md;
/* start with the first module on the list, should be the kernel */
for (mp = mod_findmodule(NULL, NULL); mp != NULL; mp = mp->m_next) {
MOD_NAME(addr, mp->m_name); /* this field must come first */
MOD_TYPE(addr, mp->m_type);
MOD_ADDR(addr, mp->m_addr);
MOD_SIZE(addr, mp->m_size);
for (md = mp->m_metadata; md != NULL; md = md->md_next)
if (!(md->md_type & MODINFOMD_NOCOPY))
MOD_METADATA(addr, md);
}
MOD_END(addr);
return(addr);
}
/*
* Load the information expected by an alpha kernel.
*
* - The kernel environment is copied into kernel space.
* - Module metadata are formatted and placed in kernel space.
*/
int
bi_load(struct bootinfo_v1 *bi, vm_offset_t *ffp_save,
struct loaded_module *mp)
{
struct loaded_module *xp;
vm_offset_t addr, bootinfo_addr;
u_int pad;
vm_offset_t ssym, esym;
struct module_metadata *md;
ssym = esym = 0;
if ((md = mod_findmetadata(mp, MODINFOMD_SSYM)) != NULL)
ssym = *((vm_offset_t *)&(md->md_data));
if ((md = mod_findmetadata(mp, MODINFOMD_ESYM)) != NULL)
esym = *((vm_offset_t *)&(md->md_data));
if (ssym == 0 || esym == 0)
ssym = esym = 0; /* sanity */
bi->ssym = ssym;
bi->esym = esym;
/* find the last module in the chain */
addr = 0;
for (xp = mod_findmodule(NULL, NULL); xp != NULL; xp = xp->m_next) {
if (addr < (xp->m_addr + xp->m_size))
addr = xp->m_addr + xp->m_size;
}
/* pad to a page boundary */
pad = (u_int)addr & PAGE_MASK;
if (pad != 0) {
pad = PAGE_SIZE - pad;
addr += pad;
}
/* copy our environment */
bi->envp = (char *)addr;
addr = bi_copyenv(addr);
/* pad to a page boundary */
pad = (u_int)addr & PAGE_MASK;
if (pad != 0) {
pad = PAGE_SIZE - pad;
addr += pad;
}
/* copy module list and metadata */
bi->modptr = addr;
addr = bi_copymodules(addr);
/* all done copying stuff in, save end of loaded object space */
bi->kernend = addr;
*ffp_save = ALPHA_K0SEG_TO_PHYS((addr + PAGE_MASK) & ~PAGE_MASK)
>> PAGE_SHIFT;
*ffp_save += 2; /* XXX OSF/1 does this, no idea why. */
return(0);
}

38
sys/boot/arc/lib/delay.c Normal file
View File

@ -0,0 +1,38 @@
/*-
* Copyright (c) 1998 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.
*
* $Id$
*/
#include <errno.h>
#include <sys/types.h>
#include "arctypes.h"
#include "arcfuncs.h"
void
delay(int usecs)
{
StallExecution(usecs);
}

View File

@ -0,0 +1,236 @@
/*-
* Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
* 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.
*
* $Id: devicename.c,v 1.3 1998/09/26 10:51:37 dfr Exp $
*/
#include <stand.h>
#include <string.h>
#include <sys/disklabel.h>
#include "bootstrap.h"
#include "libarc.h"
static int arc_parsedev(struct arc_devdesc **dev, const char *devspec, const char **path);
/*
* Point (dev) at an allocated device specifier for the device matching the
* path in (devspec). If it contains an explicit device specification,
* use that. If not, use the default device.
*/
int
arc_getdev(void **vdev, const char *devspec, const char **path)
{
struct arc_devdesc **dev = (struct arc_devdesc **)vdev;
int rv;
/*
* If it looks like this is just a path and no
* device, go with the current device.
*/
if ((devspec == NULL) ||
(devspec[0] == '/') ||
(strchr(devspec, ':') == NULL)) {
if (((rv = arc_parsedev(dev, getenv("currdev"), NULL)) == 0) &&
(path != NULL))
*path = devspec;
return(rv);
}
/*
* Try to parse the device name off the beginning of the devspec
*/
return(arc_parsedev(dev, devspec, path));
}
/*
* Point (dev) at an allocated device specifier matching the string version
* at the beginning of (devspec). Return a pointer to the remaining
* text in (path).
*
* In all cases, the beginning of (devspec) is compared to the names
* of known devices in the device switch, and then any following text
* is parsed according to the rules applied to the device type.
*
* For disk-type devices, the syntax is:
*
* disk<unit>[s<slice>][<partition>]:
*
*/
static int
arc_parsedev(struct arc_devdesc **dev, const char *devspec, const char **path)
{
struct arc_devdesc *idev;
struct devsw *dv;
int i, unit, slice, partition, err;
char *cp;
const char *np;
/* minimum length check */
if (strlen(devspec) < 2)
return(EINVAL);
/* look for a device that matches */
for (i = 0, dv = NULL; devsw[i] != NULL; i++) {
if (!strncmp(devspec, devsw[i]->dv_name, strlen(devsw[i]->dv_name))) {
dv = devsw[i];
break;
}
}
if (dv == NULL)
return(ENOENT);
idev = malloc(sizeof(struct arc_devdesc));
err = 0;
np = (devspec + strlen(dv->dv_name));
switch(dv->dv_type) {
case DEVT_NONE: /* XXX what to do here? Do we care? */
break;
case DEVT_DISK:
unit = -1;
slice = -1;
partition = -1;
if (*np && (*np != ':')) {
unit = strtol(np, &cp, 10); /* next comes the unit number */
if (cp == np) {
err = EUNIT;
goto fail;
}
if (*cp == 's') { /* got a slice number */
np = cp + 1;
slice = strtol(np, &cp, 10);
if (cp == np) {
err = ESLICE;
goto fail;
}
}
if (*cp && (*cp != ':')) {
partition = *cp - 'a'; /* get a partition number */
if ((partition < 0) || (partition >= MAXPARTITIONS)) {
err = EPART;
goto fail;
}
cp++;
}
}
if (*cp && (*cp != ':')) {
err = EINVAL;
goto fail;
}
idev->d_kind.arcdisk.unit = unit;
idev->d_kind.arcdisk.slice = slice;
idev->d_kind.arcdisk.partition = partition;
if (path != NULL)
*path = (*cp == 0) ? cp : cp + 1;
break;
case DEVT_NET:
unit = 0;
if (*np && (*np != ':')) {
unit = strtol(np, &cp, 0); /* get unit number if present */
if (cp == np) {
err = EUNIT;
goto fail;
}
}
if (*cp && (*cp != ':')) {
err = EINVAL;
goto fail;
}
idev->d_kind.netif.unit = unit;
if (path != NULL)
*path = (*cp == 0) ? cp : cp + 1;
break;
default:
err = EINVAL;
goto fail;
}
idev->d_dev = dv;
idev->d_type = dv->dv_type;
if (dev == NULL) {
free(idev);
} else {
*dev = idev;
}
return(0);
fail:
free(idev);
return(err);
}
char *
arc_fmtdev(void *vdev)
{
struct arc_devdesc *dev = (struct arc_devdesc *)vdev;
static char buf[128]; /* XXX device length constant? */
char *cp;
switch(dev->d_type) {
case DEVT_NONE:
strcpy(buf, "(no device)");
break;
case DEVT_DISK:
cp = buf;
cp += sprintf(cp, "%s%d", dev->d_dev->dv_name, dev->d_kind.arcdisk.unit);
if (dev->d_kind.arcdisk.slice > 0)
cp += sprintf(cp, "s%d", dev->d_kind.arcdisk.slice);
if (dev->d_kind.arcdisk.partition >= 0)
cp += sprintf(cp, "%c", dev->d_kind.arcdisk.partition + 'a');
strcat(cp, ":");
break;
case DEVT_NET:
sprintf(buf, "%s%d:", dev->d_dev->dv_name, dev->d_kind.netif.unit);
break;
}
return(buf);
}
/*
* Set currdev to suit the value being supplied in (value)
*/
int
arc_setcurrdev(struct env_var *ev, int flags, void *value)
{
struct arc_devdesc *ncurr;
int rv;
if ((rv = arc_parsedev(&ncurr, value, NULL)) != 0)
return(rv);
free(ncurr);
env_setenv(ev->ev_name, flags | EV_NOHOOK, value, NULL, NULL);
return(0);
}

View File

@ -0,0 +1,143 @@
/* $Id: elf_freebsd.c,v 1.6 1998/10/15 21:55:58 dfr Exp $ */
/* $NetBSD: loadfile.c,v 1.10 1998/06/25 06:45:46 ross Exp $ */
/*-
* Copyright (c) 1997 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
* NASA Ames Research Center.
*
* 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.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
*/
/*
* Copyright (c) 1992, 1993
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Ralph Campbell.
*
* 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.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
*
* @(#)boot.c 8.1 (Berkeley) 6/10/93
*/
#include <stand.h>
#include <string.h>
#include <sys/param.h>
#include <sys/linker.h>
#include <machine/elf.h>
#include <machine/prom.h>
#include <machine/rpb.h>
#include <machine/bootinfo.h>
#include "bootstrap.h"
#define _KERNEL
static int elf_exec(struct loaded_module *amp);
int bi_load(struct bootinfo_v1 *, vm_offset_t *,
struct loaded_module *);
struct module_format alpha_elf = { elf_loadmodule, elf_exec };
vm_offset_t ffp_save, ptbr_save;
static int
elf_exec(struct loaded_module *mp)
{
#if 0
static struct bootinfo_v1 bootinfo_v1;
struct module_metadata *md;
Elf_Ehdr *hdr;
int err;
if ((md = mod_findmetadata(mp, MODINFOMD_ELFHDR)) == NULL)
return(EFTYPE); /* XXX actually EFUCKUP */
hdr = (Elf_Ehdr *)&(md->md_data);
/* XXX ffp_save does not appear to be used in the kernel.. */
bzero(&bootinfo_v1, sizeof(bootinfo_v1));
err = bi_load(&bootinfo_v1, &ffp_save, mp);
if (err)
return(err);
/*
* Fill in the bootinfo for the kernel.
*/
strncpy(bootinfo_v1.booted_kernel, mp->m_name,
sizeof(bootinfo_v1.booted_kernel));
prom_getenv(PROM_E_BOOTED_OSFLAGS, bootinfo_v1.boot_flags,
sizeof(bootinfo_v1.boot_flags));
bootinfo_v1.hwrpb = (void *)HWRPB_ADDR;
bootinfo_v1.hwrpbsize = ((struct rpb *)HWRPB_ADDR)->rpb_size;
bootinfo_v1.cngetc = NULL;
bootinfo_v1.cnputc = NULL;
bootinfo_v1.cnpollc = NULL;
printf("Entering %s at 0x%lx...\n", mp->m_name, hdr->e_entry);
exit(0);
closeall();
alpha_pal_imb();
(*(void (*)())hdr->e_entry)(ffp_save, ptbr_save,
BOOTINFO_MAGIC, &bootinfo_v1, 1, 0);
#endif
}

48
sys/boot/arc/lib/module.c Normal file
View File

@ -0,0 +1,48 @@
/*-
* Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
* 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.
*
* $Id: alpha_module.c,v 1.2 1998/08/31 21:10:40 msmith Exp $
*/
/*
* alpha-specific module functionality.
*
*/
#include <stand.h>
#include <string.h>
#include "bootstrap.h"
#include "libarc.h"
/*
* Use voodoo to load modules required by current hardware.
*/
int
arc_autoload(void)
{
/* XXX use PnP to locate stuff here */
return(0);
}

39
sys/boot/arc/lib/prom.c Normal file
View File

@ -0,0 +1,39 @@
/*
* Copyright (c) 1999, Stefan Esser <se@freebsd.org>
* 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 unmodified, 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.
*
* $Id$
*
*/
#define PROM_E_BOOTED_DEV "XXX1"
#define PROM_E_BOOTED_FILE "XXX2"
#define PROM_E_BOOTED_OSFLAGS "XXX3"
#define PROM_E_TTY_DEV "XXX4"
u_int64_t
prom_getenv(PROM_E_BOOTED_FILE, bootfile, sizeof(bootfile))
{
}

View File

@ -0,0 +1,38 @@
/*-
* Copyright (c) 1998 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.
*
* $Id$
*/
#include <errno.h>
#include <sys/types.h>
#include "arctypes.h"
#include "arcfuncs.h"
void
longjmperror()
{
panic("longjmp botch.\n");
}

41
sys/boot/arc/lib/time.c Normal file
View File

@ -0,0 +1,41 @@
/*-
* Copyright (c) 1998 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.
*
* $Id$
*/
#include <errno.h>
#include <sys/types.h>
#include "arctypes.h"
#include "arcfuncs.h"
time_t
time(time_t *tloc)
{
int secs = GetRelativeTime();
if (tloc)
*tloc = secs;
return secs;
}

View File

@ -0,0 +1,90 @@
# $NetBSD: Makefile,v 1.12 1998/02/19 14:18:36 drochner Exp $
BASE= loader
PROG= ${BASE}
NOMAN=
NEWVERSWHAT= "ARC disk boot" ${MACHINE_ARCH}
.PATH: ${.CURDIR}/../common
# i386-specific bootstrap sources
SRCS+= main.c conf.c
# Always add MI sources
.PATH: ${.CURDIR}/../../common
.include <${.CURDIR}/../../common/Makefile.inc>
CFLAGS+= -mno-fp-regs
CFLAGS+= -I${.CURDIR}/../../common -I${.CURDIR}
CFLAGS+= -I${.CURDIR}/../../.. -I.
CFLAGS+= -DLOADER
CLEANFILES+= vers.c vers.o gensetdefs.o gensetdefs setdef0.o setdef1.o \
setdefs.h start.o
CLEANFILES+= ${BASE} ${BASE}.sym ${BASE}.list
CFLAGS+= -Wall
CFLAGS+= -I${LIBSTANDDIR}
CFLAGS+= -I${.CURDIR}/../include
CRT= start.o
STRIP=
BINDIR?= /boot
LOAD_ADDRESS?= 0xffffffff80900000
all: ${BASE}.exe
vers.o: ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/version
sh ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/version ${NEWVERSWHAT}
${CC} -c vers.c
${BASE}.exe: ${BASE} ${BASE}.help
elf2exe ${BASE}.sym ${BASE}.exe
#${BASE}: ${OBJS} ${LIBSTAND} ${LIBARC} ${CRT} vers.o setdef0.o setdef1.o
# ${LD} -o ${BASE}.sym -M -e __start -N -Ttext ${LOAD_ADDRESS} \
# ${CRT} setdef0.o ${OBJS} setdef1.o \
# vers.o ${LIBSTAND} ${LIBARC} ${LIBSTAND} >${.OBJDIR}/${BASE}.list
${BASE}: ${OBJS} ${LIBSTAND} ${LIBARC} ${CRT} vers.o setdef0.o setdef1.o
${LD} -o ${BASE}.sym -M -N -Ttext ${LOAD_ADDRESS} \
${CRT} setdef0.o ${OBJS} setdef1.o \
vers.o ${LIBSTAND} ${LIBARC} ${LIBSTAND} >${.OBJDIR}/${BASE}.list
${BASE}.help: help.common help.alpha
cat ${.ALLSRC} | awk -f ${.CURDIR}/../../common/merge_help.awk > ${.TARGET}
beforeinstall:
.if exists(${.OBJDIR}/loader.help)
${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 \
${.OBJDIR}/${BASE}.help ${DESTDIR}/boot
.else
${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 \
${.CURDIR}/${BASE}.help ${DESTDIR}/boot
.endif
# Other fragments still to be brought in from ../Makfile.booters?
start.o: ${.CURDIR}/../lib/arch/${MACHINE}/start.S
${CC} -c ${CFLAGS} $<
setdef0.o: setdefs.h
setdef1.o: setdefs.h
machine:
ln -sf ${.CURDIR}/../../../alpha/include machine
CLEANFILES+= machine setdefs.h gensetdefs ${BASE} ${BASE}.exe loader.help
.include <bsd.prog.mk>
setdefs.h: gensetdefs ${OBJS}
@echo Generating linker sets
@./gensetdefs ${OBJS} >setdefs.h
gensetdefs: gensetdefs.o
${CC} -static gensetdefs.o -o $@
gensetdefs.o: gensetdefs.c
${CC} -c $<
beforedepend ${OBJS}: machine

View File

@ -0,0 +1,85 @@
/*
* $Id: conf.c,v 1.2 1998/08/31 21:10:36 msmith Exp $
* From $NetBSD: conf.c,v 1.2 1997/03/22 09:03:29 thorpej Exp $
*/
/*
* Copyright (c) 1997
* Matthias Drochner. 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.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed for the NetBSD Project
* by Matthias Drochner.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* 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.
*/
#include <stand.h>
#include "libarc.h"
/*
* We could use linker sets for some or all of these, but
* then we would have to control what ended up linked into
* the bootstrap. So it's easier to conditionalise things
* here.
*
* XXX rename these arrays to be consistent and less namespace-hostile
*/
/* Exported for libstand */
struct devsw *devsw[] = {
&arcdisk,
NULL
};
struct fs_ops *file_system[] = {
&ufs_fsops,
&zipfs_fsops,
NULL
};
/* Exported for alpha only */
/*
* Sort formats so that those that can detect based on arguments
* rather than reading the file go first.
*/
extern struct module_format alpha_elf;
struct module_format *module_formats[] = {
&alpha_elf,
NULL
};
/*
* Consoles
*
* We don't prototype these in libalpha.h because they require
* data structures from bootstrap.h as well.
*/
extern struct console arcconsole;
struct console *consoles[] = {
&arcconsole,
NULL
};

View File

405
sys/boot/arc/loader/main.c Normal file
View File

@ -0,0 +1,405 @@
/*-
* Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
* Copyright (c) 1998 Doug Rabson <dfr@freebsd.org>
* 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.
*
* $Id$
*/
#include <stand.h>
#include <string.h>
#include <setjmp.h>
#include <sys/param.h>
#include "bootstrap.h"
#include "libarc.h"
#include "arctypes.h"
#include "arcfuncs.h"
extern char bootprog_name[], bootprog_rev[], bootprog_date[], bootprog_maker[];
struct arc_devdesc currdev; /* our current device */
struct arch_switch archsw; /* MI/MD interface boundary */
extern char end[];
extern void halt(void);
#define ARCENV_BOOTFILE "OSLoadFilename"
static char *MemoryTypes[] = {
"MemoryExceptionBlock",
"MemorySystemBlock",
"MemoryFree",
"MemoryBad",
"MemoryLoadedProgram",
"MemoryFirmwareTemporary",
"MemoryFirmwarePermanent",
"MemoryFreeContiguous",
"MemorySpecialMemory",
"MemoryMaximum",
};
#ifdef __alpha__
#define ptob(p) ((p) << 13)
#endif
unsigned long
memsize()
{
unsigned long amount = 0;
MEMORY_DESCRIPTOR *desc;
for (desc = GetMemoryDescriptor(NULL); desc;
desc = GetMemoryDescriptor(desc)) {
printf("%s at %x-%x\n", MemoryTypes[desc->Type],
ptob(desc->BasePage),
ptob(desc->BasePage + desc->PageCount));
if (desc->Type == MemoryFree
|| desc->Type == MemoryFirmwareTemporary)
amount += (desc->PageCount << 13); /* XXX pagesize */
}
return amount;
}
static char *ConfigurationClasses[] = {
"SystemClass",
"ProcessorClass",
"CacheClass",
"AdapterClass",
"ControllerClass",
"PeripheralClass",
"MemoryClass",
"MaximumClass",
};
static char *ConfigurationTypes[] = {
"ArcSystem",
"CentralProcessor",
"FloatingPointProcessor",
"PrimaryIcache",
"PrimaryDcache",
"SecondaryIcache",
"SecondaryDcache",
"SecondaryCache",
"EisaAdapter",
"TcAdapter",
"ScsiAdapter",
"DtiAdapter",
"MultiFunctionAdapter",
"DiskController",
"TapeController",
"CdromController",
"WormController",
"SerialController",
"NetworkController",
"DisplayController",
"ParallelController",
"PointerController",
"KeyboardController",
"AudioController",
"OtherController",
"DiskPeripheral",
"FloppyDiskPeripheral",
"TapePeripheral",
"ModemPeripheral",
"MonitorPeripheral",
"PrinterPeripheral",
"PointerPeripheral",
"KeyboardPeripheral",
"TerminalPeripheral",
"OtherPeripheral",
"LinePeripheral",
"NetworkPeripheral",
"SystemMemory",
"MaximumType",
};
static char *ConfigurationTypeCodes[] = {
"ARC",
"CPU",
"FPC",
"PrimaryIcache",
"PrimaryDcache",
"SecondaryIcache",
"SecondaryDcache",
"SecondaryCache",
"eisa",
"TcAdapter", /* XXX ? */
"scsi",
"DtiAdapter", /* XXX ? */
"multi",
"disk",
"TapeController", /* XXX ? */
"CdromController", /* XXX ? */
"WormController", /* XXX ? */
"serial",
"NetworkController", /* XXX ? */
"video",
"par",
"PointerController", /* XXX ? */
"key",
"AudioController", /* XXX ? */
"OtherController", /* XXX ? */
"rdisk",
"fdisk",
"TapePeripheral", /* XXX ? */
"ModemPeripheral", /* XXX ? */
"MonitorPeripheral", /* XXX ? */
"PrinterPeripheral", /* XXX ? */
"PointerPeripheral", /* XXX ? */
"keyboard",
"TerminalPeripheral", /* XXX ? */
"OtherPeripheral", /* XXX ? */
"LinePeripheral", /* XXX ? */
"NetworkPeripheral", /* XXX ? */
"Memory",
"MaximumType"
};
static void
indent(int level)
{
while (level--)
putchar(' ');
}
void
printconfig(unsigned int level, CONFIGURATION_COMPONENT *component)
{
CONFIGURATION_COMPONENT *child;
indent(level);
printf("%s(%s,%d)",
ConfigurationClasses[component->Class],
ConfigurationTypes[component->Type],
component->Key);
#if 1
if (component->IdentifierLength)
printf("=%d,%s\n", component->IdentifierLength,
ptr(component->Identifier));
else
putchar('\n');
#endif
getchar();
for (child = GetChild(component); child; child = GetPeer(child)) {
printconfig(level + 2, child);
}
}
void
dumpdisk(const char *name)
{
u_int32_t fd, count;
unsigned char buf[512];
int i, j;
printf("dump first sector of %s\n", name);
if (Open(name, OpenReadOnly, &fd) != ESUCCESS) {
printf("can't open disk\n");
return;
}
if (Read(fd, buf, 512, &count) != ESUCCESS) {
printf("can't read from disk\n");
Close(fd);
return;
}
for (i = 0; i < 16; i++) {
for (j = 0; j < 32; j++)
printf("%02x", buf[i*32 + j]);
putchar('\n');
}
Close(fd);
}
void
listdisks(char *path, CONFIGURATION_COMPONENT *component)
{
CONFIGURATION_COMPONENT *child;
char newpath[80];
char keybuf[20];
if (path == NULL) {
printf("\nARC disk devices:\n");
newpath[0] = '\0';
} else {
strcpy(newpath, path);
strcat(newpath, ConfigurationTypeCodes[component->Type]);
sprintf(keybuf, "(%d)", component->Key);
strcat(newpath, keybuf);
}
if (!strcmp(ConfigurationTypeCodes[component->Type], "rdisk") ||
!strcmp(ConfigurationTypeCodes[component->Type], "fdisk")) {
printf("%s\n", newpath);
}
for (child = GetChild(component); child; child = GetPeer(child)) {
listdisks(newpath, child);
}
}
static int exit_code = 0;
jmp_buf exit_env;
void
exit(int code)
{
exit_code = 0;
longjmp(exit_env, 1);
}
int
main(int argc, int argv[], int envp[])
{
int i;
char *bootfile;
if (setjmp(exit_env))
return exit_code;
/*
* Initialise the heap as early as possible. Once this is done,
* alloc() is usable. The stack is buried inside us, so this is
* safe.
*/
setheap((void *)end, (void *)(end + 512*1024));
/*
* XXX Chicken-and-egg problem; we want to have console output
* early, but some console attributes may depend on reading from
* eg. the boot device, which we can't do yet. We can use
* printf() etc. once this is done.
*/
cons_probe();
#if 0
printconfig(0, GetChild(NULL));
dumpdisk("scsi(0)disk(0)rdisk(0)partition(0)");
#endif
listdisks(NULL, GetChild(NULL));
printf("\n");
make_rpb();
/*
* Initialise the block cache
*/
bcache_init(32, 512); /* 16k XXX tune this */
/*
* March through the device switch probing for things.
*/
for (i = 0; devsw[i] != NULL; i++)
if (devsw[i]->dv_init != NULL)
(devsw[i]->dv_init)();
printf("\n");
printf("%s, Revision %s\n", bootprog_name, bootprog_rev);
printf("(%s, %s)\n", bootprog_maker, bootprog_date);
printf("Memory: %ld k\n", memsize() / 1024);
/* We're booting from an SRM disk, try to spiff this */
/* XXX presumes that biosdisk is first in devsw */
currdev.d_dev = devsw[0];
currdev.d_type = currdev.d_dev->dv_type;
currdev.d_kind.arcdisk.unit = 0;
/* XXX should be able to detect this, default to autoprobe */
currdev.d_kind.arcdisk.slice = -1;
/* default to 'a' */
currdev.d_kind.arcdisk.partition = 0;
/* Create arc-specific variables */
bootfile = GetEnvironmentVariable(ARCENV_BOOTFILE);
if (bootfile)
setenv("bootfile", bootfile, 1);
env_setenv("currdev", EV_VOLATILE,
arc_fmtdev(&currdev), arc_setcurrdev, env_nounset);
env_setenv("loaddev", EV_VOLATILE,
arc_fmtdev(&currdev), env_noset, env_nounset);
setenv("LINES", "24", 1); /* optional */
archsw.arch_autoload = arc_autoload;
archsw.arch_getdev = arc_getdev;
archsw.arch_copyin = arc_copyin;
archsw.arch_copyout = arc_copyout;
archsw.arch_readin = arc_readin;
interact(); /* doesn't return */
return 0; /* keep compiler happy */
}
COMMAND_SET(reboot, "reboot", "reboot the system", command_reboot);
static int
command_reboot(int argc, char *argv[])
{
printf("Rebooting...\n");
delay(1000000);
FwReboot();
/* Note: we shouldn't get to this point! */
panic("Reboot failed!");
exit(0);
}
COMMAND_SET(quit, "quit", "exit the loader", command_quit);
static int
command_quit(int argc, char *argv[])
{
exit(0);
return(CMD_OK);
}
#if 0
COMMAND_SET(stack, "stack", "show stack usage", command_stack);
static int
command_stack(int argc, char *argv[])
{
char *cp;
for (cp = &stackbase; cp < &stacktop; cp++)
if (*cp != 0)
break;
printf("%d bytes of stack used\n", &stacktop - cp);
return(CMD_OK);
}
#endif
COMMAND_SET(heap, "heap", "show heap usage", command_heap);
static int
command_heap(int argc, char *argv[])
{
printf("heap base at %p, top at %p, used %ld\n", end, sbrk(0), sbrk(0) - end);
return(CMD_OK);
}

View File

@ -0,0 +1,49 @@
/*-
* Copyright (c) 1997 John D. Polstra
* 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.
*
* $Id: setdef0.c,v 1.1.1.1 1998/08/21 03:17:42 msmith Exp $
*/
#ifdef __ELF__
#include <sys/param.h>
#include <sys/kernel.h>
/*
* DEFINE_SET creates the section and label for a set, and emits the
* count word at the front of it.
*/
#define DEFINE_SET(set, count) \
__asm__(".section .set." #set ",\"aw\""); \
__asm__(".globl " #set); \
__asm__(".type " #set ",@object"); \
__asm__(".p2align 3"); \
__asm__(#set ":"); \
__asm__(".quad " #count); \
__asm__(".previous")
#include "setdefs.h" /* Contains a `DEFINE_SET' for each set */
#endif /* __ELF__ */

View File

@ -0,0 +1,41 @@
/*-
* Copyright (c) 1997 John D. Polstra
* 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.
*
* $Id: setdef1.c,v 1.1.1.1 1998/08/21 03:17:42 msmith Exp $
*/
#ifdef __ELF__
/*
* DEFINE_SET emits the NULL terminator for a set.
*/
#define DEFINE_SET(set, count) \
__asm__(".section .set." #set ",\"aw\""); \
__asm__(".quad 0"); \
__asm__(".previous")
#include "setdefs.h" /* Contains a `DEFINE_SET' for each set */
#endif /* __ELF__ */

View File

@ -0,0 +1,7 @@
$Id: version,v 1.1.1.1 1998/08/21 03:17:42 msmith Exp $
NOTE ANY CHANGES YOU MAKE TO THE BOOTBLOCKS HERE. The format of this
file is important. Make sure the current version number is on line 6.
0.1: Initial i386 version, germinated from the NetBSD i386
standalone, but enormously modified.