035c8bc86e3d9edf63b74fb99b97a9863b57f65a
[coreboot.git] / src / devices / oprom / yabel / compat / functions.c
1 /****************************************************************************
2  * YABEL BIOS Emulator
3  *
4  * This program and the accompanying materials
5  * are made available under the terms of the BSD License
6  * which accompanies this distribution, and is available at
7  * http://www.opensource.org/licenses/bsd-license.php
8  *
9  * Copyright (c) 2008 Pattrick Hueper <phueper@hueper.net>
10  ****************************************************************************/
11
12 /* this file contains functions provided by SLOF, that the current biosemu implementation needs
13  * they should go away  inthe future...
14  */
15
16 #include <types.h>
17 #include <string.h>
18 #include <device/device.h>
19 #include "../debug.h"
20 #include "../biosemu.h"
21 #include "../vbe.h"
22 #include "../compat/time.h"
23
24 #define VMEM_SIZE (1024 * 1024) /* 1 MB */
25
26 #if !defined(CONFIG_YABEL_DIRECTHW) || (!CONFIG_YABEL_DIRECTHW)
27 #ifdef CONFIG_YABEL_VIRTMEM_LOCATION
28 u8* vmem = (u8 *) CONFIG_YABEL_VIRTMEM_LOCATION;
29 #else
30 u8* vmem = (u8 *) (16*1024*1024); /* default to 16MB */
31 #endif
32 #else
33 u8* vmem = NULL;
34 #endif
35
36 void run_bios(struct device * dev, unsigned long addr)
37 {
38
39         biosemu(vmem, VMEM_SIZE, dev, addr);
40
41 #if CONFIG_BOOTSPLASH
42         vbe_set_graphics();
43 #endif
44
45         if (vmem != NULL) {
46                 printf("Copying legacy memory from %p to the lower 1MB\n", vmem);
47                 memcpy((void *)0x00000, vmem + 0x00000, 0x400);         // IVT
48                 memcpy((void *)0x00400, vmem + 0x00400, 0x100);         // BDA
49                 memcpy((void *)0xc0000, vmem + 0xc0000, 0x10000);       // VGA OPROM
50         }
51 }
52
53 unsigned long tb_freq = 0;
54
55 u64 get_time(void)
56 {
57     u64 act;
58     u32 eax, edx;
59
60     __asm__ __volatile__(
61         "rdtsc"
62         : "=a"(eax), "=d"(edx)
63         : /* no inputs, no clobber */);
64     act = ((u64) edx << 32) | eax; 
65     return act;
66 }