|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: * file: pe_printf.c
24: * i386 platform expert output initialization.
25: */
26: #include <sys/types.h>
27: #include <mach/vm_param.h>
28: #include <stdarg.h>
29: #include <pexpert/protos.h>
30: #include <pexpert/pexpert.h>
31: #include <pexpert/i386/kdsoft.h>
32:
33: #define KA_NORMAL 0x07
34: #define COLOR_PLATNUM 0x80
35:
36: /* extern references */
37: extern void printf(const char *format, ...);
38: extern void cninit(void);
39: extern void display_putc(char c);
40: extern void cnputc(char c);
41:
42: /* local references */
43: void PE_printf(const char *fmt, ...);
44: unsigned char *mapframebuffer(caddr_t,int);
45: void (*PE_putc)(char c);
46: u_char *vid_start;
47:
48: void PE_init_printf(boolean_t vm_initialized)
49: {
50: PE_Video v;
51:
52:
53:
54: if (!vm_initialized)
55: {
56: /*
57: * Initialize the console so we can print. Start out by pointing to 0xa0000, but eventually
58: * map our space in and then update the console "vid_start".
59: */
60: /* FIX ME! */
61:
62: vid_start = 0xa0000;
63: v.v_width = PE_state.video.v_width;
64: v.v_depth = PE_state.video.v_depth;
65: v.v_rowBytes = PE_state.video.v_rowBytes;
66: /* HACK - Only "one segment" is available on the screen */
67: v.v_height = 0x10000 / (PE_state.video.v_rowBytes);
68: initialize_screen(&v, vid_start);
69: }
70: else
71: {
72: /*
73: * Initialize the console so we can print. Now that VM is initialized, map out physical
74: * space in.
75: */
76:
77: if (PE_state.video.v_baseAddr != 0)
78: {
79: unsigned char *fb;
80:
81: fb = mapframebuffer((caddr_t)PE_state.video.v_baseAddr,
82: PE_state.video.v_rowBytes * PE_state.video.v_height);
83: vid_start = fb;
84: initialize_screen(&PE_state.video, vid_start);
85: printf("Console initialized. Mode: Linear (%ldx%ldx%ld)\n", PE_state.video.v_width,
86: PE_state.video.v_height,
87: PE_state.video.v_depth);
88: init_display_putc(fb, PE_state.video.v_width * PE_state.video.v_depth / 8, PE_state.video.v_height);
89: PE_putc = display_putc;
90: PE_printf("Debug console initialized.\n"); PE_pause(1);
91:
92: }
93: }
94: }
95:
96: void PE_printf(const char *fmt, ...)
97: {
98: va_list listp;
99:
100: va_start(listp, fmt);
101: _doprnt(fmt, &listp, PE_putc, 16);
102: va_end(listp);
103: }
104:
105: /*
106: * mapblit: map the framebuffer into kernel vm and return the (virtual)
107: * address.
108: */
109: unsigned char *
110: mapframebuffer(
111: caddr_t physaddr, /* start of framebuffer */
112: int length) /* num bytes to map */
113: {
114: vm_offset_t vmaddr;
115:
116: if (physaddr != (caddr_t)trunc_page(physaddr))
117: panic("Framebuffer not on page boundary");
118:
119: vmaddr = io_map((vm_offset_t)physaddr, length);
120: if (vmaddr == 0)
121: panic("can't alloc VM for framebuffer");
122:
123: return((unsigned char *)vmaddr);
124: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.