*参照元 [#e2faba39] #backlinks *説明 [#m22686fa] -パス: [[linux-4.4.1/lib/ioremap.c]] -FIXME: これは何? --説明 **引数 [#c95b51a5] - -pud_t *pud -- --[[linux-4.4.1/pud_t]] -unsigned long addr -- -unsigned long end -- -phys_addr_t phys_addr -- --[[linux-4.4.1/phys_addr_t]] -pgprot_t prot -- --[[linux-4.4.1/pgprot_t]] **返り値 [#u3192ecd] - -int -- **参考 [#da72efdf] *実装 [#k3402924] static inline int ioremap_pmd_range(pud_t *pud, unsigned long addr, unsigned long end, phys_addr_t phys_addr, pgprot_t prot) { pmd_t *pmd; unsigned long next; - --[[linux-4.4.1/pmd_t]] phys_addr -= addr; pmd = pmd_alloc(&init_mm, pud, addr); if (!pmd) return -ENOMEM; - --[[linux-4.4.1/pmd_alloc()]] --[[linux-4.4.1/init_mm(global)]] do { next = pmd_addr_end(addr, end); - --[[linux-4.4.1/pmd_addr_end()]] if (ioremap_pmd_enabled() && ((next - addr) == PMD_SIZE) && IS_ALIGNED(phys_addr + addr, PMD_SIZE)) { - --[[linux-4.4.1/ioremap_pmd_enabled()]] --[[linux-4.4.1/IS_ALIGNED()]] if (pmd_set_huge(pmd, phys_addr + addr, prot)) continue; - --[[linux-4.4.1/pmd_set_huge()]] } if (ioremap_pte_range(pmd, addr, next, phys_addr + addr, prot)) return -ENOMEM; - --[[linux-4.4.1/ioremap_pte_range()]] } while (pmd++, addr = next, addr != end); return 0; } *コメント [#gaacbf7c]