[ioapi] Absorb virt_to_phys() and phys_to_virt() into the I/O API
[people/sha0/gpxe.git] / src / arch / i386 / include / virtaddr.h
1 #ifndef VIRTADDR_H
2 #define VIRTADDR_H
3
4 /* Segment selectors as used in our protected-mode GDTs.
5  *
6  * Don't change these unless you really know what you're doing.
7  */
8
9 #define VIRTUAL_CS 0x08
10 #define VIRTUAL_DS 0x10
11 #define PHYSICAL_CS 0x18
12 #define PHYSICAL_DS 0x20
13 #define REAL_CS 0x28
14 #define REAL_DS 0x30
15 #if 0
16 #define LONG_CS 0x38
17 #define LONG_DS 0x40
18 #endif
19
20 #ifndef ASSEMBLY
21
22 #ifndef KEEP_IT_REAL
23
24 /*
25  * Without -DKEEP_IT_REAL, we are in 32-bit protected mode with a
26  * fixed link address but an unknown physical start address.  Our GDT
27  * sets up code and data segments with an offset of virt_offset, so
28  * that link-time addresses can still work.
29  *
30  */
31
32 /* Variables in virtaddr.S */
33 extern unsigned long virt_offset;
34
35 #else /* KEEP_IT_REAL */
36
37 #include <stdint.h>
38
39 /*
40  * With -DKEEP_IT_REAL, we are in 16-bit real mode with fixed link
41  * addresses and a segmented memory model.  We have separate code and
42  * data segments.
43  *
44  * Because we may be called in 16-bit protected mode (damn PXE spec),
45  * we cannot simply assume that physical = segment * 16 + offset.
46  * Instead, we have to look up the physical start address of the
47  * segment in the !PXE structure.  We have to assume that
48  * virt_to_phys() is called only on pointers within the data segment,
49  * because nothing passes segment information to us.
50  *
51  * We don't implement phys_to_virt at all, because there will be many
52  * addresses that simply cannot be reached via a virtual address when
53  * the virtual address space is limited to 64kB!
54  */
55
56 static inline unsigned long virt_to_phys ( volatile const void *virt_addr ) {
57         /* Cheat: just for now, do the segment*16+offset calculation */
58         uint16_t ds;
59
60         __asm__ ( "movw %%ds, %%ax" : "=a" ( ds ) : );
61         return ( 16 * ds + ( ( unsigned long ) virt_addr ) );
62 }
63
64 /* Define it as a deprecated function so that we get compile-time
65  * warnings, rather than just the link-time errors.
66  */
67 extern void * phys_to_virt ( unsigned long phys_addr )
68      __attribute__ ((deprecated));
69
70 #endif /* KEEP_IT_REAL */
71
72 #endif /* ASSEMBLY */
73
74 #endif /* VIRTADDR_H */