Add a first bit of a framework. Builds the following parts, in
accordance to the newboot document: * reset vector (16 bytes) * vpd (240bytes) * boot block (8k - 256b) * lar archive (256-8 k) The boot block is kind of simple, still. It enables pmode, car, and starts looking for an initram module in the lar archive. Note: This doesnt do much at the moment, as gas seems to produce buggy code in init.S. Take this as a suggestion of how it might work and please provide patches fixing it and bringing it into shape. Signed-off-by: Stefan Reinauer <stepan@coresystems.de> Acked-by: Ronald G. Minnich <rminnich@gmail.com> git-svn-id: svn://coreboot.org/repository/LinuxBIOSv3@62 f3766cd6-281f-0410-b1cd-43a5c92072e9
This commit is contained in:
parent
e388149797
commit
c275218a89
25 changed files with 1627 additions and 496 deletions
9
include/cpu/generic/x86/arch/hlt.h
Normal file
9
include/cpu/generic/x86/arch/hlt.h
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
#ifndef ARCH_HLT_H
|
||||
#define ARCH_HLT_H
|
||||
|
||||
static inline __attribute__((always_inline)) void hlt(void)
|
||||
{
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
#endif
|
||||
48
include/cpu/generic/x86/div64.h
Normal file
48
include/cpu/generic/x86/div64.h
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
#ifndef __I386_DIV64
|
||||
#define __I386_DIV64
|
||||
|
||||
/*
|
||||
* do_div() is NOT a C function. It wants to return
|
||||
* two values (the quotient and the remainder), but
|
||||
* since that doesn't work very well in C, what it
|
||||
* does is:
|
||||
*
|
||||
* - modifies the 64-bit dividend _in_place_
|
||||
* - returns the 32-bit remainder
|
||||
*
|
||||
* This ends up being the most efficient "calling
|
||||
* convention" on x86.
|
||||
*/
|
||||
#define do_div(n,base) ({ \
|
||||
unsigned long __upper, __low, __high, __mod, __base; \
|
||||
__base = (base); \
|
||||
asm("":"=a" (__low), "=d" (__high):"A" (n)); \
|
||||
__upper = __high; \
|
||||
if (__high) { \
|
||||
__upper = __high % (__base); \
|
||||
__high = __high / (__base); \
|
||||
} \
|
||||
asm("divl %2":"=a" (__low), "=d" (__mod):"rm" (__base), "0" (__low), "1" (__upper)); \
|
||||
asm("":"=A" (n):"a" (__low),"d" (__high)); \
|
||||
__mod; \
|
||||
})
|
||||
|
||||
/*
|
||||
* (long)X = ((long long)divs) / (long)div
|
||||
* (long)rem = ((long long)divs) % (long)div
|
||||
*
|
||||
* Warning, this will do an exception if X overflows.
|
||||
*/
|
||||
#define div_long_long_rem(a,b,c) div_ll_X_l_rem(a,b,c)
|
||||
|
||||
extern inline long
|
||||
div_ll_X_l_rem(long long divs, long div, long *rem)
|
||||
{
|
||||
long dum2;
|
||||
__asm__("divl %2":"=a"(dum2), "=d"(*rem)
|
||||
: "rm"(div), "A"(divs));
|
||||
|
||||
return dum2;
|
||||
|
||||
}
|
||||
#endif
|
||||
18
include/fallback.h
Normal file
18
include/fallback.h
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
#ifndef PART_FALLBACK_BOOT_H
|
||||
#define PART_FALLBACK_BOOT_H
|
||||
|
||||
#ifndef ASSEMBLY
|
||||
|
||||
#if HAVE_FALLBACK_BOOT == 1
|
||||
void set_boot_successful(void);
|
||||
#else
|
||||
#define set_boot_successful()
|
||||
#endif
|
||||
|
||||
void boot_successful(void);
|
||||
|
||||
#endif /* ASSEMBLY */
|
||||
|
||||
#define RTC_BOOT_BYTE 48
|
||||
|
||||
#endif /* PART_FALLBACK_BOOT_H */
|
||||
39
include/lar.h
Normal file
39
include/lar.h
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
* lar - LinuxBIOS archiver
|
||||
*
|
||||
* Copright (C) 2006 coresystems GmbH
|
||||
* Written by Stefan Reinauer <stepan@coresystems.de> for coresystems GmbH
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
|
||||
*
|
||||
* This file may be dual licensed with the new BSD license.
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define MAGIC "LARCHIVE"
|
||||
#define MAX_PATHLEN 1024
|
||||
|
||||
struct lar_header {
|
||||
char magic[8];
|
||||
u32 len;
|
||||
u32 checksum;
|
||||
u32 offset;
|
||||
};
|
||||
|
||||
struct mem_file {
|
||||
void *start;
|
||||
int len;
|
||||
};
|
||||
|
||||
130
include/string.h
Normal file
130
include/string.h
Normal file
|
|
@ -0,0 +1,130 @@
|
|||
#ifndef STRING_H
|
||||
#define STRING_H
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
extern void *memcpy(void *dest, const void *src, size_t n);
|
||||
extern void *memmove(void *dest, const void *src, size_t n);
|
||||
extern void *memset(void *s, int c, size_t n);
|
||||
extern int memcmp(const void *s1, const void *s2, size_t n);
|
||||
|
||||
extern int sprintf(char * buf, const char *fmt, ...);
|
||||
|
||||
// yes, linux has fancy ones. We don't care. This stuff gets used
|
||||
// hardly at all. And the pain of including those files is just too high.
|
||||
|
||||
//extern inline void strcpy(char *dst, char *src) {while (*src) *dst++ = *src++;}
|
||||
|
||||
//extern inline int strlen(char *src) { int i = 0; while (*src++) i++; return i;}
|
||||
|
||||
static inline size_t strnlen(const char *src, size_t max)
|
||||
{
|
||||
size_t i = 0;
|
||||
while((*src++) && (i < max)) {
|
||||
i++;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
static inline size_t strlen(const char *src)
|
||||
{
|
||||
size_t i = 0;
|
||||
while(*src++) {
|
||||
i++;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
static inline char *strchr(const char *s, int c)
|
||||
{
|
||||
for (; *s; s++) {
|
||||
if (*s == c)
|
||||
return (char *) s;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline char *strdup(const char *s)
|
||||
{
|
||||
size_t sz = strlen(s) + 1;
|
||||
char *d = malloc(sz);
|
||||
memcpy(d, s, sz);
|
||||
return d;
|
||||
}
|
||||
|
||||
static inline char *strncpy(char *to, const char *from, int count)
|
||||
{
|
||||
register char *ret = to;
|
||||
|
||||
while (count > 0) {
|
||||
count--;
|
||||
if ((*to++ = *from++) == '\0')
|
||||
break;
|
||||
}
|
||||
|
||||
while (count > 0) {
|
||||
count--;
|
||||
*to++ = '\0';
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int strcmp(const char *s1, const char *s2)
|
||||
{
|
||||
int r;
|
||||
|
||||
while ((r = (*s1 - *s2)) == 0 && *s1) {
|
||||
s1++;
|
||||
s2++;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
static inline int isspace(int c)
|
||||
{
|
||||
switch (c) {
|
||||
case ' ': case '\f': case '\n':
|
||||
case '\r': case '\t': case '\v':
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static inline int isdigit(int c)
|
||||
{
|
||||
return (c >= '0' && c <= '9');
|
||||
}
|
||||
|
||||
static inline int isxdigit(int c)
|
||||
{
|
||||
return ((c >= '0' && c <= '9') ||
|
||||
(c >= 'a' && c <= 'f') ||
|
||||
(c >= 'A' && c <= 'F'));
|
||||
}
|
||||
|
||||
static inline int isupper(int c)
|
||||
{
|
||||
return (c >= 'A' && c <= 'Z');
|
||||
}
|
||||
|
||||
static inline int islower(int c)
|
||||
{
|
||||
return (c >= 'a' && c <= 'z');
|
||||
}
|
||||
|
||||
static inline int toupper(int c)
|
||||
{
|
||||
if (islower(c))
|
||||
c -= 'a'-'A';
|
||||
return c;
|
||||
}
|
||||
|
||||
static inline int tolower(int c)
|
||||
{
|
||||
if (isupper(c))
|
||||
c -= 'A'-'a';
|
||||
return c;
|
||||
}
|
||||
#endif /* STRING_H */
|
||||
15
include/uart8250.h
Normal file
15
include/uart8250.h
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
#ifndef UART8250_H
|
||||
#define UART8250_H
|
||||
|
||||
struct uart8250 {
|
||||
unsigned int baud;
|
||||
/* Do I need an lcs parameter here? */
|
||||
};
|
||||
|
||||
unsigned char uart8250_rx_byte(unsigned base_port);
|
||||
int uart8250_can_rx_byte(unsigned base_port);
|
||||
void uart8250_tx_byte(unsigned base_port, unsigned char data);
|
||||
void uart8250_init(unsigned base_port, unsigned divisor, unsigned lcs);
|
||||
void init_uart8250(unsigned base_port, struct uart8250 *uart);
|
||||
|
||||
#endif /* UART8250_H */
|
||||
Loading…
Reference in a new issue