⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cons.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include	"u.h"#include	"mem.h"#include	"dat.h"#include	"fns.h"#include	"lib.h"enum {	/* prom operations */	Promop_getc   = 1,	Promop_puts   = 2,	Promop_open   = 0x10,	Promop_close  = 0x11,	Promop_read   = 0x13,	Promop_write  = 0x14,	Promop_getenv = 0x22,	/* environment variable indices for getenv */	/* auto_action might be 1; it looks that way. */	Promenv_booted_dev	= 4,	Promenv_booted_file	= 6,	Promenv_booted_osflags	= 8,	Promenv_tty_dev		= 0xf,};Hwrpb	*hwrpb;static uvlong	dispatchf;static ulong	clk2ms;voidconsinit(void){	Procdesc *p;	Hwcrb *crb;	Hwdsr *dsr;	char *s;	hwrpb = (Hwrpb*)0x10000000;	crb = (Hwcrb*)((ulong)hwrpb + hwrpb->crboff);	p = (Procdesc*)(crb->dispatchva);	dispatchf = p->addr;	clk2ms = hwrpb->cfreq/1000;	print("\nAlpha Plan 9 secondary boot\n");	if (hwrpb->rev >= 6) {		dsr = (Hwdsr*)((ulong)hwrpb + hwrpb->dsroff);		s = (char*)dsr + dsr->sysnameoff + 8;		print("%s\n", s);	}}uvlongdispatch(uvlong r16, uvlong r17, uvlong r18, uvlong r19, uvlong r20){	return gendispatch(dispatchf, r16, r17, r18, r19, r20);};intdevopen(char *s){	vlong ret;	int n;	n = strlen(s);	ret = dispatch(0x10, (uvlong)s, n, 0, 0);	if (ret < 0)		return -1;	return (int) ret;}intdevclose(int fd){	vlong ret;	ret = dispatch(0x11, fd, 0, 0, 0);	if (ret < 0)		return -1;	return 0;}intdevread(int fd, uchar *buf, int len, int blkno){	vlong ret;	ret = dispatch(0x13, fd, len, (uvlong)buf, blkno);	if (ret < 0)		return -1;	return (int) ret;}intdevwrite(int fd, uchar *buf, int len, int blkno){	vlong ret;	ret = dispatch(0x14, fd, len, (uvlong)buf, blkno);	if (ret < 0)		return -1;	return (int) ret;}voiddumpenv(void){	int id, n;	static char buf[256];	/* old upper bound was 0x100, which blows up on my 164LX. 50 works. */	for (id = 1; id < 50; id++) {		n = dispatch(Promop_getenv, id, (uvlong)buf, sizeof(buf)-1, 0);		if (n == 0)			continue;		if (n < 0) {			print("dispatch failed at id %d\n", id);			break;		}		buf[n] = 0;		print("env[0x%x]: %s\n", id, buf);	}}char *getenv(char *name){	int id, n;	static char buf[256];	if (strcmp(name, "booted_dev") == 0)		id = Promenv_booted_dev;	else		return 0;	n = dispatch(Promop_getenv, id, (uvlong)buf, sizeof(buf), 0);	if (n < 0)		return 0;	buf[n] = 0;	return buf;}voidputstrn0(char *s, int n){	uvlong ret;	int cnt;	for (;;) {		ret = dispatch(2, 0, (uvlong)s, n, 0);		cnt = (int) ret;		s += cnt;		n -= cnt;		if (n <= 0)			break;	}}voidputstrn(char *s, int n){	char *p;	for (;;) {		if (n == 0)			return;		p = memchr(s, '\n', n);		if (p == 0) {			putstrn0(s, n);			return;		}		putstrn0(s, p-s);		putstrn0("\r\n", 2);		n -= p-s+1;		s = p+1;	}}intsnprint(char *s, int n, char *fmt, ...){	va_list arg;	va_start(arg, fmt);	n = doprint(s, s+n, fmt, arg) - s;	va_end(arg);	return n;}intsprint(char *s, char *fmt, ...){	int n;	va_list arg;	va_start(arg, fmt);	n = doprint(s, s+PRINTSIZE, fmt, arg) - s;	va_end(arg);	return n;}intprint(char *fmt, ...){	int n;	va_list arg;	char buf[PRINTSIZE];	va_start(arg, fmt);	n = doprint(buf, buf+sizeof(buf), fmt, arg) - buf;	va_end(arg);	putstrn(buf, n);	return n;}voidpanic(char *fmt, ...){	int n;	va_list arg;	char buf[PRINTSIZE];	strcpy(buf, "panic: ");	va_start(arg, fmt);	n = doprint(buf+strlen(buf), buf+sizeof(buf), fmt, arg) - buf;	va_end(arg);	buf[n] = '\n';	putstrn(buf, n+1);	firmware();}ulongmsec(void){	static ulong last, wrap;	ulong cnt;	cnt = pcc_cnt();	if (cnt < last)		wrap++;	last = cnt;	return (((uvlong)wrap << 32) + cnt)/clk2ms;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -