blob: 035c8bc86e3d9edf63b74fb99b97a9863b57f65a [file] [log] [blame]
Stefan Reinauer38cd29e2009-08-11 21:28:25 +00001/****************************************************************************
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>
Stefan Reinauer074356e2009-10-25 19:50:47 +000017#include <string.h>
Stefan Reinauer38cd29e2009-08-11 21:28:25 +000018#include <device/device.h>
Stefan Reinauerd650e992010-02-22 04:33:13 +000019#include "../debug.h"
Uwe Hermann01ce6012010-03-05 10:03:50 +000020#include "../biosemu.h"
Stefan Reinauer3c486f82010-03-17 04:04:20 +000021#include "../vbe.h"
Myles Watsonb0259112010-03-05 18:27:19 +000022#include "../compat/time.h"
Stefan Reinauer38cd29e2009-08-11 21:28:25 +000023
Stefan Reinauerd650e992010-02-22 04:33:13 +000024#define VMEM_SIZE (1024 * 1024) /* 1 MB */
Stefan Reinauer38cd29e2009-08-11 21:28:25 +000025
Stefan Reinauerd650e992010-02-22 04:33:13 +000026#if !defined(CONFIG_YABEL_DIRECTHW) || (!CONFIG_YABEL_DIRECTHW)
Stefan Reinauer38cd29e2009-08-11 21:28:25 +000027#ifdef CONFIG_YABEL_VIRTMEM_LOCATION
28u8* vmem = (u8 *) CONFIG_YABEL_VIRTMEM_LOCATION;
29#else
30u8* vmem = (u8 *) (16*1024*1024); /* default to 16MB */
31#endif
Stefan Reinauerd650e992010-02-22 04:33:13 +000032#else
33u8* vmem = NULL;
34#endif
Stefan Reinauer38cd29e2009-08-11 21:28:25 +000035
Stefan Reinauer38cd29e2009-08-11 21:28:25 +000036void run_bios(struct device * dev, unsigned long addr)
37{
Stefan Reinauerd650e992010-02-22 04:33:13 +000038
Stefan Reinauer38cd29e2009-08-11 21:28:25 +000039 biosemu(vmem, VMEM_SIZE, dev, addr);
Stefan Reinauerd650e992010-02-22 04:33:13 +000040
41#if CONFIG_BOOTSPLASH
42 vbe_set_graphics();
43#endif
44
45 if (vmem != NULL) {
Uwe Hermann01ce6012010-03-05 10:03:50 +000046 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
Stefan Reinauerd650e992010-02-22 04:33:13 +000050 }
Stefan Reinauer38cd29e2009-08-11 21:28:25 +000051}
52
Myles Watsonb0259112010-03-05 18:27:19 +000053unsigned long tb_freq = 0;
54
Stefan Reinauer38cd29e2009-08-11 21:28:25 +000055u64 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}