Modify SD driver for direct i/o (no rdisk).
This commit is contained in:
@@ -22,7 +22,6 @@
|
||||
#include <sys/namei.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/kconfig.h>
|
||||
#include <sys/rdisk.h>
|
||||
|
||||
u_int swapstart, nswap; /* start and size of swap space */
|
||||
size_t physmem; /* total amount of physical memory */
|
||||
@@ -104,8 +103,6 @@ main()
|
||||
register struct proc *p;
|
||||
register int i;
|
||||
register struct fs *fs = NULL;
|
||||
char inbuf[4];
|
||||
char inch;
|
||||
int s __attribute__((unused));
|
||||
|
||||
startup();
|
||||
@@ -149,97 +146,18 @@ main()
|
||||
nchinit();
|
||||
clkstart();
|
||||
|
||||
pipedev = rootdev;
|
||||
|
||||
/* Attach services. */
|
||||
struct conf_service *svc;
|
||||
for (svc = conf_service_init; svc->svc_attach != NULL; svc++)
|
||||
(*svc->svc_attach)();
|
||||
|
||||
s = spl0();
|
||||
rdisk_init();
|
||||
|
||||
if (rootdev == NODEV)
|
||||
rootdev = get_boot_device();
|
||||
if (swapdev == NODEV)
|
||||
swapdev = get_swap_device();
|
||||
pipedev = rootdev;
|
||||
|
||||
/* Mount a root filesystem. */
|
||||
for (;;) {
|
||||
if(rootdev!=-1)
|
||||
{
|
||||
fs = mountfs (rootdev, (boothowto & RB_RDONLY) ? MNT_RDONLY : 0,
|
||||
(struct inode*) 0);
|
||||
}
|
||||
if (fs)
|
||||
break;
|
||||
printf ("No root filesystem available!\n");
|
||||
// rdisk_list_partitions(RDISK_FS);
|
||||
retry:
|
||||
printf ("Please enter device to boot from (press ? to list): ");
|
||||
inch=0;
|
||||
inbuf[0] = inbuf[1] = inbuf[2] = inbuf[3] = 0;
|
||||
while((inch=cngetc()) != '\r')
|
||||
{
|
||||
switch(inch)
|
||||
{
|
||||
case '?':
|
||||
printf("?\n");
|
||||
rdisk_list_partitions(RDISK_FS);
|
||||
printf ("Please enter device to boot from (press ? to list): ");
|
||||
break;
|
||||
default:
|
||||
printf("%c",inch);
|
||||
inbuf[0] = inbuf[1];
|
||||
inbuf[1] = inbuf[2];
|
||||
inbuf[2] = inbuf[3];
|
||||
inbuf[3] = inch;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
inch = 0;
|
||||
if(inbuf[0]=='r' && inbuf[1]=='d')
|
||||
{
|
||||
if(inbuf[2]>='0' && inbuf[2] < '0'+rdisk_num_disks())
|
||||
{
|
||||
if(inbuf[3]>='a' && inbuf[3]<='d')
|
||||
{
|
||||
rootdev=makedev(inbuf[2]-'0',inbuf[3]-'a'+1);
|
||||
inch = 1;
|
||||
}
|
||||
}
|
||||
} else if(inbuf[1]=='r' && inbuf[2]=='d') {
|
||||
if(inbuf[3]>='0' && inbuf[3] < '0'+rdisk_num_disks())
|
||||
{
|
||||
rootdev=makedev(inbuf[3]-'0',0);
|
||||
inch = 1;
|
||||
}
|
||||
} else if(inbuf[3] == 0) {
|
||||
inch = 1;
|
||||
}
|
||||
if(inch==0)
|
||||
{
|
||||
printf("\nUnknown device.\n\n");
|
||||
goto retry;
|
||||
}
|
||||
printf ("\n\n");
|
||||
}
|
||||
printf ("phys mem = %u kbytes\n", physmem / 1024);
|
||||
printf ("user mem = %u kbytes\n", MAXMEM / 1024);
|
||||
if(minor(rootdev)==0)
|
||||
{
|
||||
printf ("root dev = rd%d (%d,%d)\n",
|
||||
major(rootdev),
|
||||
major(rootdev), minor(rootdev)
|
||||
);
|
||||
} else {
|
||||
printf ("root dev = rd%d%c (%d,%d)\n",
|
||||
major(rootdev), 'a'+minor(rootdev)-1,
|
||||
major(rootdev), minor(rootdev)
|
||||
);
|
||||
}
|
||||
|
||||
printf ("root size = %u kbytes\n", fs->fs_fsize * DEV_BSIZE / 1024);
|
||||
s = spl0();
|
||||
fs = mountfs (rootdev, (boothowto & RB_RDONLY) ? MNT_RDONLY : 0, 0);
|
||||
if (! fs)
|
||||
panic ("No root filesystem found!");
|
||||
mount[0].m_inodp = (struct inode*) 1; /* XXX */
|
||||
mount_updname (fs, "/", "root", 1, 4);
|
||||
time.tv_sec = fs->fs_time;
|
||||
@@ -247,76 +165,19 @@ retry:
|
||||
|
||||
/* Find a swap file. */
|
||||
swapstart = 1;
|
||||
while(swapdev == -1)
|
||||
{
|
||||
printf("Please enter swap device (press ? to list): ");
|
||||
inbuf[0] = inbuf[1] = inbuf[2] = inbuf[3] = 0;
|
||||
while((inch = cngetc())!='\r')
|
||||
{
|
||||
switch(inch)
|
||||
{
|
||||
case '?':
|
||||
printf("?\n");
|
||||
rdisk_list_partitions(RDISK_SWAP);
|
||||
printf("Please enter swap device (press ? to list): ");
|
||||
break;
|
||||
default:
|
||||
printf("%c",inch);
|
||||
inbuf[0] = inbuf[1];
|
||||
inbuf[1] = inbuf[2];
|
||||
inbuf[2] = inbuf[3];
|
||||
inbuf[3] = inch;
|
||||
break;
|
||||
}
|
||||
}
|
||||
inch = 0;
|
||||
if(inbuf[0]=='r' && inbuf[1]=='d')
|
||||
{
|
||||
if(inbuf[2]>='0' && inbuf[2] < '0'+rdisk_num_disks())
|
||||
{
|
||||
if(inbuf[3]>='a' && inbuf[3]<='d')
|
||||
{
|
||||
swapdev=makedev(inbuf[2]-'0',inbuf[3]-'a'+1);
|
||||
inch = 1;
|
||||
}
|
||||
}
|
||||
} else if(inbuf[1]=='r' && inbuf[2]=='d') {
|
||||
if(inbuf[3]>='0' && inbuf[3] < '0'+rdisk_num_disks())
|
||||
{
|
||||
swapdev=makedev(inbuf[3]-'0',0);
|
||||
inch = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if(minor(swapdev)!=0)
|
||||
{
|
||||
if(partition_type(swapdev)!=RDISK_SWAP)
|
||||
{
|
||||
printf("\nNot a swap partition!\n\n");
|
||||
swapdev=-1;
|
||||
}
|
||||
}
|
||||
}
|
||||
nswap = rdsize(swapdev);
|
||||
|
||||
if(minor(swapdev)==0)
|
||||
{
|
||||
printf ("swap dev = rd%d (%d,%d)\n",
|
||||
major(swapdev),
|
||||
major(swapdev), minor(swapdev)
|
||||
);
|
||||
} else {
|
||||
printf ("swap dev = rd%d%c (%d,%d)\n",
|
||||
major(swapdev), 'a'+minor(swapdev)-1,
|
||||
major(swapdev), minor(swapdev)
|
||||
);
|
||||
}
|
||||
(*bdevsw[major(swapdev)].d_open)(swapdev, FREAD|FWRITE, S_IFBLK);
|
||||
printf ("swap size = %u kbytes\n", nswap * DEV_BSIZE / 1024);
|
||||
nswap = (*bdevsw[major(swapdev)].d_psize)(swapdev);
|
||||
if (nswap <= 0)
|
||||
panic ("zero swap size"); /* don't want to panic, but what ? */
|
||||
mfree (swapmap, nswap, swapstart);
|
||||
|
||||
printf ("phys mem = %u kbytes\n", physmem / 1024);
|
||||
printf ("user mem = %u kbytes\n", MAXMEM / 1024);
|
||||
printf ("root dev = (%d,%d)\n", major(rootdev), minor(rootdev));
|
||||
printf ("swap dev = (%d,%d)\n", major(swapdev), minor(swapdev));
|
||||
printf ("root size = %u kbytes\n", fs->fs_fsize * DEV_BSIZE / 1024);
|
||||
printf ("swap size = %u kbytes\n", nswap * DEV_BSIZE / 1024);
|
||||
|
||||
/* Kick off timeout driven events by calling first time. */
|
||||
schedcpu (0);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user