*参照元 [#he2d3acb] #backlinks *説明 [#v3ec0124] -パス: [[linux-4.4.1/arch/arm64/mm/ioremap.c]] -FIXME: これは何? --説明 **引数 [#e93a0878] -phys_addr_t phys_addr -- --[[linux-4.4.1/phys_addr_t]] -size_t size -pgprot_t prot -- --[[linux-4.4.1/pgprot_t]] -void *caller -- **返り値 [#l835362d] -void __iomem * -- **参考 [#i0e3f4e4] *実装 [#u041aac1] static void __iomem *__ioremap_caller(phys_addr_t phys_addr, size_t size, pgprot_t prot, void *caller) { unsigned long last_addr; unsigned long offset = phys_addr & ~PAGE_MASK; int err; unsigned long addr; struct vm_struct *area; - --[[linux-4.4.1/vm_struct ]] --[[linux-4.4.1/vm_struct]] /* * Page align the mapping address and size, taking account of any * offset. */ phys_addr &= PAGE_MASK; size = PAGE_ALIGN(size + offset); - --[[linux-4.4.1/PAGE_ALIGN()]] /* * Don't allow wraparound, zero size or outside PHYS_MASK. */ last_addr = phys_addr + size - 1; if (!size || last_addr < phys_addr || (last_addr & ~PHYS_MASK)) return NULL; /* * Don't allow RAM to be mapped. */ if (WARN_ON(pfn_valid(__phys_to_pfn(phys_addr)))) return NULL; - --[[linux-4.4.1/WARN_ON()]] --[[linux-4.4.1/pfn_valid()]] --[[linux-4.4.1/__phys_to_pfn()]] area = get_vm_area_caller(size, VM_IOREMAP, caller); if (!area) return NULL; - --[[linux-4.4.1/get_vm_area_caller()]] addr = (unsigned long)area->addr; area->phys_addr = phys_addr; err = ioremap_page_range(addr, addr + size, phys_addr, prot); if (err) { vunmap((void *)addr); return NULL; } - --[[linux-4.4.1/ioremap_page_range()]] --[[linux-4.4.1/vunmap()]] return (void __iomem *)(offset + addr); } *コメント [#bc991541]