#include <sys/param.h>
#include <lib/libkern/libkern.h>
#include <lib/libsa/stand.h>
#include <lib/libsa/loadfile.h>
#include <stand/boot/cmd.h>
#include <sys/exec.h>
#include <sys/stat.h>
#include <sys/reboot.h>
#include <machine/rpb.h>
#include <machine/prom.h>
#include <machine/autoconf.h>
void init_prom_calls(void);
void OSFpal(void);
void halt(void);
long alpha_rpcc(void);
int
main()
{
#ifdef DEBUG
struct rpb *r;
struct mddt *mddtp;
struct mddt_cluster *memc;
int i;
#endif
static char boot_file[128];
extern char *kernelfile;
char *s;
int uppercase = 1;
init_prom_calls();
cninit();
OSFpal();
#ifdef DEBUG
r = (struct rpb *)HWRPB_ADDR;
mddtp = (struct mddt *)(HWRPB_ADDR + r->rpb_memdat_off);
printf("%d memory clusters\n", mddtp->mddt_cluster_cnt);
for (i = 0; i < mddtp->mddt_cluster_cnt; i++) {
memc = &mddtp->mddt_clusters[i];
printf("%d: (%d) %lx-%lx\n", i, memc->mddt_usage,
memc->mddt_pfn << PAGE_SHIFT,
(memc->mddt_pfn + memc->mddt_pg_cnt) << PAGE_SHIFT);
}
#endif
prom_getenv(PROM_E_BOOTED_FILE, boot_file, sizeof(boot_file));
if (boot_file[0] != '\0') {
for (s = boot_file; *s != '\0'; s++) {
if (islower(*s)) {
uppercase = 0;
break;
}
}
if (uppercase) {
for (s = boot_file; *s != '\0'; s++)
*s = tolower(*s);
}
kernelfile = boot_file;
}
boot(0);
}
void
devboot(dev_t dev , char *path)
{
snprintf(path, BOOTDEVLEN, "disk");
}
void
machdep()
{
}
void
run_loadfile(uint64_t *marks, int howto)
{
extern paddr_t ptbr_save;
static struct bootinfo_v1 bootinfo_v1;
u_int64_t entry;
char boot_flags[128];
bzero(&bootinfo_v1, sizeof(bootinfo_v1));
bootinfo_v1.ssym = marks[MARK_SYM];
bootinfo_v1.esym = marks[MARK_END];
prom_getenv(PROM_E_BOOTED_OSFLAGS, boot_flags, sizeof(boot_flags));
bcopy(boot_flags, 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;
bootinfo_v1.howto = howto;
entry = marks[MARK_START];
(*(void (*)(u_int64_t, u_int64_t, u_int64_t, void *, u_int64_t,
u_int64_t))entry)(0, ptbr_save, BOOTINFO_MAGIC, &bootinfo_v1, 1, 0);
}
int
cnspeed(dev_t dev, int sp)
{
return 9600;
}
char *
ttyname(int fd)
{
return "console";
}
dev_t
ttydev(char *name)
{
return NODEV;
}
time_t
getsecs()
{
static long tnsec;
static long lastpcc, wrapsecs;
long curpcc;
if (tnsec == 0) {
tnsec = 1;
lastpcc = alpha_rpcc() & 0xffffffff;
wrapsecs = (0xffffffff /
((struct rpb *)HWRPB_ADDR)->rpb_cc_freq) + 1;
#if 0
printf("getsecs: cc freq = %d, time to wrap = %d\n",
((struct rpb *)HWRPB_ADDR)->rpb_cc_freq, wrapsecs);
#endif
}
curpcc = alpha_rpcc() & 0xffffffff;
if (curpcc < lastpcc)
curpcc += 0x100000000;
tnsec += ((curpcc - lastpcc) * 1000000000) / ((struct rpb *)HWRPB_ADDR)->rpb_cc_freq;
lastpcc = curpcc;
return (tnsec / 1000000000);
}