1*1bb76ff1Sjsg /* $OpenBSD: set_memory.h,v 1.5 2023/01/01 01:34:58 jsg Exp $ */
27f4dd379Sjsg /*
37f4dd379Sjsg * Copyright (c) 2013, 2014, 2015 Mark Kettenis
47f4dd379Sjsg *
57f4dd379Sjsg * Permission to use, copy, modify, and distribute this software for any
67f4dd379Sjsg * purpose with or without fee is hereby granted, provided that the above
77f4dd379Sjsg * copyright notice and this permission notice appear in all copies.
87f4dd379Sjsg *
97f4dd379Sjsg * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
107f4dd379Sjsg * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
117f4dd379Sjsg * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
127f4dd379Sjsg * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
137f4dd379Sjsg * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
147f4dd379Sjsg * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
157f4dd379Sjsg * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
167f4dd379Sjsg */
177f4dd379Sjsg
187f4dd379Sjsg #ifndef _ASM_SET_MEMORY_H
197f4dd379Sjsg #define _ASM_SET_MEMORY_H
207f4dd379Sjsg
21*1bb76ff1Sjsg #include <sys/types.h>
22311b6aa8Smpi #include <sys/systm.h>
237f4dd379Sjsg #include <sys/atomic.h>
24c349dbc7Sjsg
25c349dbc7Sjsg #include <sys/param.h> /* for PAGE_SIZE on i386 */
26c349dbc7Sjsg #include <uvm/uvm_extern.h>
27c349dbc7Sjsg
287f4dd379Sjsg #include <machine/pmap.h>
297f4dd379Sjsg
307f4dd379Sjsg #if defined(__amd64__) || defined(__i386__)
317f4dd379Sjsg
327f4dd379Sjsg static inline int
set_pages_array_wb(struct vm_page ** pages,int addrinarray)337f4dd379Sjsg set_pages_array_wb(struct vm_page **pages, int addrinarray)
347f4dd379Sjsg {
357f4dd379Sjsg int i;
367f4dd379Sjsg
377f4dd379Sjsg for (i = 0; i < addrinarray; i++)
387f4dd379Sjsg atomic_clearbits_int(&pages[i]->pg_flags, PG_PMAP_WC);
397f4dd379Sjsg
407f4dd379Sjsg return 0;
417f4dd379Sjsg }
427f4dd379Sjsg
437f4dd379Sjsg static inline int
set_pages_array_wc(struct vm_page ** pages,int addrinarray)447f4dd379Sjsg set_pages_array_wc(struct vm_page **pages, int addrinarray)
457f4dd379Sjsg {
467f4dd379Sjsg int i;
477f4dd379Sjsg
487f4dd379Sjsg for (i = 0; i < addrinarray; i++)
497f4dd379Sjsg atomic_setbits_int(&pages[i]->pg_flags, PG_PMAP_WC);
507f4dd379Sjsg
517f4dd379Sjsg return 0;
527f4dd379Sjsg }
537f4dd379Sjsg
547f4dd379Sjsg static inline int
set_pages_array_uc(struct vm_page ** pages,int addrinarray)557f4dd379Sjsg set_pages_array_uc(struct vm_page **pages, int addrinarray)
567f4dd379Sjsg {
577f4dd379Sjsg /* XXX */
587f4dd379Sjsg return 0;
597f4dd379Sjsg }
607f4dd379Sjsg
617f4dd379Sjsg static inline int
set_pages_wb(struct vm_page * page,int numpages)627f4dd379Sjsg set_pages_wb(struct vm_page *page, int numpages)
637f4dd379Sjsg {
645ca02815Sjsg struct vm_page *pg;
655ca02815Sjsg paddr_t start = VM_PAGE_TO_PHYS(page);
665ca02815Sjsg int i;
675ca02815Sjsg
685ca02815Sjsg for (i = 0; i < numpages; i++) {
695ca02815Sjsg pg = PHYS_TO_VM_PAGE(start + (i * PAGE_SIZE));
705ca02815Sjsg if (pg != NULL)
715ca02815Sjsg atomic_clearbits_int(&pg->pg_flags, PG_PMAP_WC);
725ca02815Sjsg }
735ca02815Sjsg
747f4dd379Sjsg return 0;
757f4dd379Sjsg }
767f4dd379Sjsg
777f4dd379Sjsg static inline int
set_pages_uc(struct vm_page * page,int numpages)787f4dd379Sjsg set_pages_uc(struct vm_page *page, int numpages)
797f4dd379Sjsg {
807f4dd379Sjsg /* XXX */
817f4dd379Sjsg return 0;
827f4dd379Sjsg }
837f4dd379Sjsg
847f4dd379Sjsg #endif /* defined(__amd64__) || defined(__i386__) */
857f4dd379Sjsg
867f4dd379Sjsg #endif
87