Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / slof / ppc64.c
1 /******************************************************************************
2  * Copyright (c) 2004, 2008 IBM Corporation
3  * All rights reserved.
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  * Contributors:
10  *     IBM Corporation - initial implementation
11  *****************************************************************************/
12
13 #include <cpu.h>
14
15 /* the exception frame should be page aligned
16  * the_exception_frame is used by the handler to store a copy of all
17  * registers after an exception; this copy can then be used by paflof's
18  * exception handler to printout a register dump */
19 cell the_exception_frame[0x400 / CELLSIZE] __attribute__ ((aligned(PAGE_SIZE)));;
20
21 /* the_client_frame is the register save area when starting a client */
22 cell the_client_frame[0x1000 / CELLSIZE] __attribute__ ((aligned(0x100)));
23 cell the_client_stack[0x8000 / CELLSIZE] __attribute__ ((aligned(0x100)));
24 /* THE forth stack */
25 cell the_data_stack[0x2000 / CELLSIZE] __attribute__ ((aligned(0x100)));
26 /* the forth return stack */
27 cell the_return_stack[0x2000 / CELLSIZE] __attribute__ ((aligned(0x100)));
28
29 /* forth stack and return-stack pointers */
30 cell *restrict dp;
31 cell *restrict rp;
32
33 /* terminal input buffer */
34 cell the_tib[0x1000 / CELLSIZE] __attribute__ ((aligned(0x100)));
35 /* temporary string buffers */
36 char the_pockets[NUMPOCKETS * POCKETSIZE] __attribute__ ((aligned(0x100)));
37
38 cell the_comp_buffer[0x1000 / CELLSIZE] __attribute__ ((aligned(0x100)));
39
40 cell the_heap[HEAP_SIZE / CELLSIZE] __attribute__ ((aligned(0x1000)));
41 cell *the_heap_start = &the_heap[0];
42 cell *the_heap_end = &the_heap[HEAP_SIZE / CELLSIZE];
43
44 extern void io_putchar(unsigned char);
45
46
47 static unsigned long __attribute__((noinline))
48 call_c(cell arg0, cell arg1, cell arg2, cell entry)
49 {
50         register unsigned long r3 asm("r3") = arg0.u;
51         register unsigned long r4 asm("r4") = arg1.u;
52         register unsigned long r5 asm("r5") = arg2.u;
53         register unsigned long r6 = entry.u         ;
54
55         asm volatile("mflr 31 ; mtctr %4 ; bctrl ; mtlr 31"
56                      : "=r" (r3)
57                      : "r" (r3), "r" (r4), "r" (r5), "r" (r6)
58                      : "ctr", "r6", "r7", "r8", "r9", "r10", "r11",
59                        "r12", "r13", "r31", "lr", "cc");
60
61         return r3;
62 }
63
64
65 long
66 writeLogByte_wrapper(long x, long y)
67 {
68         unsigned long result;
69
70         SET_CI;
71         result = writeLogByte(x, y);
72         CLR_CI;
73
74         return result;
75 }
76
77
78 /**
79  * Standard write function for the libc.
80  *
81  * @param fd    file descriptor (should always be 1 or 2)
82  * @param buf   pointer to the array with the output characters
83  * @param count number of bytes to be written
84  * @return      the number of bytes that have been written successfully
85  */
86 int
87 write(int fd, const void *buf, int count)
88 {
89         int i;
90         char *ptr = (char *)buf;
91
92         if (fd != 1 && fd != 2)
93                 return 0;
94
95         for (i = 0; i < count; i++) {
96                 if (*ptr == '\n')
97                         io_putchar('\r');
98                 io_putchar(*ptr++);
99         }
100
101         return i;
102 }
103
104 /* This should probably be temporary until a better solution is found */
105 void
106 asm_cout(long Character, long UART, long NVRAM __attribute__((unused)))
107 {
108         if (UART)
109                 io_putchar(Character);
110 }