unsigned int nr);
void free_perdomain_mappings(struct domain *);
+void __iomem *ioremap_wc(paddr_t, size_t);
+
extern int memory_add(unsigned long spfn, unsigned long epfn, unsigned int pxm);
void domain_set_alloc_bitsize(struct domain *d);
#define __PAGE_HYPERVISOR_RX (_PAGE_PRESENT | _PAGE_ACCESSED)
#define __PAGE_HYPERVISOR (__PAGE_HYPERVISOR_RX | \
_PAGE_DIRTY | _PAGE_RW)
+#define __PAGE_HYPERVISOR_WT (__PAGE_HYPERVISOR | _PAGE_PWT)
#define __PAGE_HYPERVISOR_UCMINUS (__PAGE_HYPERVISOR | _PAGE_PCD)
#define __PAGE_HYPERVISOR_UC (__PAGE_HYPERVISOR | _PAGE_PCD | _PAGE_PWT)
+#define __PAGE_HYPERVISOR_WC (__PAGE_HYPERVISOR | _PAGE_PAT)
#define __PAGE_HYPERVISOR_SHSTK (__PAGE_HYPERVISOR_RO | _PAGE_DIRTY)
#define MAP_SMALL_PAGES _PAGE_AVAIL0 /* don't use superpages mappings */
_PAGE_GLOBAL | _PAGE_NX)
#define PAGE_HYPERVISOR_UC (__PAGE_HYPERVISOR_UC | \
_PAGE_GLOBAL | _PAGE_NX)
+#define PAGE_HYPERVISOR_WC (__PAGE_HYPERVISOR_WC | \
+ _PAGE_GLOBAL | _PAGE_NX)
+#define PAGE_HYPERVISOR_WT (__PAGE_HYPERVISOR_WT | \
+ _PAGE_GLOBAL | _PAGE_NX)
#endif /* __X86_64_PAGE_H__ */
return (void __force __iomem *)va;
}
+void __iomem *__init ioremap_wc(paddr_t pa, size_t len)
+{
+ mfn_t mfn = _mfn(PFN_DOWN(pa));
+ unsigned int offs = pa & (PAGE_SIZE - 1);
+ unsigned int nr = PFN_UP(offs + len);
+ void *va;
+
+ WARN_ON(page_is_ram_type(mfn_x(mfn), RAM_TYPE_CONVENTIONAL));
+
+ va = __vmap(&mfn, nr, 1, 1, PAGE_HYPERVISOR_WC, VMAP_DEFAULT);
+
+ return (void __force __iomem *)(va + offs);
+}
+
int create_perdomain_mapping(struct domain *d, unsigned long va,
unsigned int nr, l1_pgentry_t **pl1tab,
struct page_info **ppg)
#include <xen/param.h>
#include <xen/xmalloc.h>
#include <xen/kernel.h>
+#include <xen/mm.h>
#include <xen/vga.h>
#include <asm/io.h>
-#include <asm/page.h>
#include "font.h"
#include "lfb.h"
lfbp.text_columns = vlfb_info.width / font->width;
lfbp.text_rows = vlfb_info.height / font->height;
- lfbp.lfb = lfb = ioremap(lfb_base(), vram_remap);
+ lfbp.lfb = lfb = ioremap_wc(lfb_base(), vram_remap);
if ( !lfb )
return;
static void lfb_flush(void)
{
- if ( vesa_mtrr == 3 )
- __asm__ __volatile__ ("sfence" : : : "memory");
+ __asm__ __volatile__ ("sfence" : : : "memory");
}
void __init vesa_endboot(bool_t keep)
{
case XEN_VGATYPE_TEXT_MODE_3:
if ( page_is_ram_type(paddr_to_pfn(0xB8000), RAM_TYPE_CONVENTIONAL) ||
- ((video = ioremap(0xB8000, 0x8000)) == NULL) )
+ ((video = ioremap_wc(0xB8000, 0x8000)) == NULL) )
return;
outw(0x200a, 0x3d4); /* disable cursor */
columns = vga_console_info.u.text_mode_3.columns;
{
case XEN_VGATYPE_TEXT_MODE_3:
if ( !vgacon_keep )
+ {
memset(video, 0, columns * lines * 2);
+ iounmap(video);
+ video = ZERO_BLOCK_PTR;
+ }
break;
case XEN_VGATYPE_VESA_LFB:
case XEN_VGATYPE_EFI_LFB: