NetBSD/sys/arch/i386/netboot/proto.h

163 lines
3.5 KiB
C

/* netboot
*
* $Log: proto.h,v $
* Revision 1.1 1993/07/08 16:04:10 brezak
* Diskless boot prom code from Jim McKim (mckim@lerc.nasa.gov)
*
* Revision 1.4 1993/06/30 20:14:15 mckim
* Added BOOTP support.
*
* Revision 1.3 1993/06/08 14:22:38 mckim
* Fast in line assembly bcopy(), bzero().
*
* Revision 1.2 1993/05/28 20:01:28 mckim
* Fixed various StartProg() problems.
*
* Revision 1.1.1.1 1993/05/28 11:41:08 mckim
* Initial version.
*
*
* TBD - need for common typedefs - rethink?
* TBD - move config include into the source files - this is just expedient
*/
#include "config.h"
#include "nbtypes.h"
#define TRUE 1
#define FALSE 0
#define MDUMP 100 /* TBD - remove */
#define MAX_FILE_NAME_LEN 128
#define CRTBASE ((char *)0xb8000)
#define CHECKPOINT(x) (CRTBASE[0] = x)
#define nelt(x) (sizeof(x)/sizeof((x)[0]))
void ENTER(char *); /* remove TBD */
int IsKbdCharReady(void);
u_char GetKbdChar(void);
void HandleKbdAttn(void);
void KbdWait(int n);
int bcmp(const void *, const void *, int);
void volatile exit(int);
void volatile ExitToBios(void);
void gateA20(void);
int getc(void);
int getchar(void);
u_short GetMemSize(u_short);
int gets(char *);
int ischar(void);
void longjmp(jmp_buf env, int val);
void printf( /* const char *, ... */ );
void putc(int);
void putchar(int);
int rand(void);
void ResetCpu(void);
int setjmp(jmp_buf env);
void srand(u_int);
void StartProg(u_long phyaddr, u_long *args);
int strlen(const char *);
char *strncat(char *, const char *, int len);
char *strncpy(char *, const char *, int len);
int strcmp(const char *, const char *);
u_long timer(void);
/* macros in pio.h, rewritten as in-line functions */
/* TBD - define addr arg as long - short might result in extra
bit masking whereas longs simply get plonked down in %edx */
#undef inb
#undef outb
#undef inw
#undef outw
#undef inl
#undef outl
static inline u_char
inb(u_short addr) {
u_char datum;
asm volatile("inb %1, %0" : "=a" (datum) : "d" (addr));
return datum;
}
static inline void
outb(u_short addr, u_char datum) {
asm volatile("outb %0, %1" : : "a" (datum), "d" (addr));
}
static inline u_short
inw(u_short addr) {
u_short datum;
asm volatile(".byte 0x66; inl %1, %0" : "=a" (datum) : "d" (addr));
return datum;
}
static inline void
outw(u_short addr, u_short datum) {
asm volatile(".byte 0x66; outw %0, %1" : : "a" (datum), "d" (addr));
}
static inline u_long
inl(u_short addr) {
u_long datum;
asm volatile("inw %1, %0" : "=a" (datum) : "d" (addr));
return datum;
}
static inline void
outl(u_short addr, u_long datum) {
asm volatile("outw %0, %1" : : "a" (datum), "d" (addr));
}
#if __GCC__ >= 2
/* fast versions of bcopy(), bzero() */
static inline void
bcopy(const void *from, void *to, int len) {
/* assumes %es == %ds */
asm("
mov %0, %%esi
mov %1, %%edi
mov %2, %%ecx
cld
rep
movsb
" : : "g" (from), "g" (to), "g" (len) : "esi", "edi", "ecx");
}
static inline void
bzero(void *dest, int len) {
/* assumes %es == %ds */
asm("
mov %0, %%edi
mov %1, %%ecx
xor %%eax, %%eax
cld
rep
stosb
" : : "g" (dest), "g" (len) : "edi", "ecx", "eax");
}
#else
static inline void
bcopy(char *from, char *to, int len)
{
while (len-- > 0)
*to++ = *from++;
}
static inline void
bzero(char *to, int len)
{
while (len-- > 0)
*to++ = '\0';
}
#endif
static inline void PhysBcopy(u_long src, u_long dest, u_long nbytes) {
bcopy((void *)src, (void *)dest, nbytes);
}
static inline void PhysBzero(u_long dest, u_long nbytes) {
bzero((void *)dest, nbytes);
}