[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v5 19/23] xen/riscv: add minimal stuff to mm.h to build full Xen
On 26.02.2024 18:39, Oleksii Kurochko wrote: > --- a/xen/arch/riscv/include/asm/mm.h > +++ b/xen/arch/riscv/include/asm/mm.h > @@ -3,11 +3,252 @@ > #ifndef _ASM_RISCV_MM_H > #define _ASM_RISCV_MM_H > > +#include <public/xen.h> > +#include <xen/bug.h> > +#include <xen/mm-frame.h> > +#include <xen/pdx.h> > +#include <xen/types.h> > + > #include <asm/page-bits.h> > > #define pfn_to_paddr(pfn) ((paddr_t)(pfn) << PAGE_SHIFT) > #define paddr_to_pfn(pa) ((unsigned long)((pa) >> PAGE_SHIFT)) > > +#define paddr_to_pdx(pa) mfn_to_pdx(maddr_to_mfn(pa)) > +#define gfn_to_gaddr(gfn) pfn_to_paddr(gfn_x(gfn)) > +#define gaddr_to_gfn(ga) _gfn(paddr_to_pfn(ga)) > +#define mfn_to_maddr(mfn) pfn_to_paddr(mfn_x(mfn)) > +#define maddr_to_mfn(ma) _mfn(paddr_to_pfn(ma)) > +#define vmap_to_mfn(va) maddr_to_mfn(virt_to_maddr((vaddr_t)va)) va needs parenthesizing here. Also why vaddr_t here but ... > +#define vmap_to_page(va) mfn_to_page(vmap_to_mfn(va)) > + > +static inline unsigned long __virt_to_maddr(unsigned long va) > +{ > + BUG_ON("unimplemented"); > + return 0; > +} > + > +static inline void *__maddr_to_virt(unsigned long ma) > +{ > + BUG_ON("unimplemented"); > + return NULL; > +} > + > +#define virt_to_maddr(va) __virt_to_maddr((unsigned long)(va)) > +#define maddr_to_virt(pa) __maddr_to_virt((unsigned long)(pa)) ... unsigned long here? In fact for __maddr_to_virt() I think there better wouldn't be any cast, such that the compiler can spot if, by mistake, a pointer type value was passed in. Or, wait, we can go yet further (also on x86): There are no uses of __maddr_to_virt() except here. Hence the symbol isn't needed (anymore?) in the first place. > +/* Convert between Xen-heap virtual addresses and machine frame numbers. */ > +#define __virt_to_mfn(va) mfn_x(maddr_to_mfn(virt_to_maddr(va))) > +#define __mfn_to_virt(mfn) maddr_to_virt(mfn_to_maddr(_mfn(mfn))) > + > +/* > + * We define non-underscored wrappers for above conversion functions. > + * These are overriden in various source files while underscored version > + * remain intact. > + */ > +#define virt_to_mfn(va) __virt_to_mfn(va) > +#define mfn_to_virt(mfn) __mfn_to_virt(mfn) > + > +struct page_info > +{ > + /* Each frame can be threaded onto a doubly-linked list. */ > + struct page_list_entry list; > + > + /* Reference count and various PGC_xxx flags and fields. */ > + unsigned long count_info; > + > + /* Context-dependent fields follow... */ > + union { > + /* Page is in use: ((count_info & PGC_count_mask) != 0). */ > + struct { > + /* Type reference count and various PGT_xxx flags and fields. */ > + unsigned long type_info; > + } inuse; Blank line here please. Jan > + /* Page is on a free list: ((count_info & PGC_count_mask) == 0). */ > + union { > + struct { > + /* > + * Index of the first *possibly* unscrubbed page in the > buddy. > + * One more bit than maximum possible order to accommodate > + * INVALID_DIRTY_IDX. > + */ > +#define INVALID_DIRTY_IDX ((1UL << (MAX_ORDER + 1)) - 1) > + unsigned long first_dirty:MAX_ORDER + 1; > + > + /* Do TLBs need flushing for safety before next page use? */ > + bool need_tlbflush:1; > + > +#define BUDDY_NOT_SCRUBBING 0 > +#define BUDDY_SCRUBBING 1 > +#define BUDDY_SCRUB_ABORT 2 > + unsigned long scrub_state:2; > + }; > + > + unsigned long val; > + } free; > + } u; > + > + union { > + /* Page is in use */ > + struct { > + /* Owner of this page (NULL if page is anonymous). */ > + struct domain *domain; > + } inuse; > + > + /* Page is on a free list. */ > + struct { > + /* Order-size of the free chunk this page is the head of. */ > + unsigned int order; > + } free; > + } v; > + > + union { > + /* > + * Timestamp from 'TLB clock', used to avoid extra safety flushes. > + * Only valid for: a) free pages, and b) pages with zero type count > + */ > + uint32_t tlbflush_timestamp; > + }; > +};
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |