163 lines
3.5 KiB
C
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);
|
||
|
}
|