On 07/20/2013 09:26 AM, Qiaowei Ren wrote:
>  
>       /* now map TXT heap */
> -     heap_base = ioremap(*(u64 *)(config + TXTCR_HEAP_BASE),
> -                         *(u64 *)(config + TXTCR_HEAP_SIZE));
> +     heap_base = ioremap(readl(config + TXTCR_HEAP_BASE),
> +                         readl(config + TXTCR_HEAP_SIZE));

You are changing u64 references to readl()... this means you are doing
only 32-bit reads.

>       iounmap(config);
>       if (!heap_base)
>               return NULL;
>  
>       /* walk heap to SinitMleData */
>       /* skip BiosData */
> -     heap_ptr = heap_base + *(u64 *)heap_base;
> +     heap_ptr = heap_base + readq(heap_base);
>       /* skip OsMleData */
> -     heap_ptr += *(u64 *)heap_ptr;
> +     heap_ptr += readq(heap_ptr);
>       /* skip OsSinitData */
> -     heap_ptr += *(u64 *)heap_ptr;
> +     heap_ptr += readq(heap_ptr);

As I believe Ingo already commented on, readq() only exists on 64 bits.

You can #include <asm-generic/io-64-nonatomic-lo-hi.h> to remedy that.

>       /* now points to SinitMleDataSize; set to SinitMleData */
>       heap_ptr += sizeof(u64);
>       /* get addr of DMAR table */
> +     dmar_tbl_off = readl(heap_ptr +
> +                     offsetof(struct sinit_mle_data, vtd_dmars_off));
>       dmar_tbl = (struct acpi_table_header *)(heap_ptr +
> -                ((struct sinit_mle_data *)heap_ptr)->vtd_dmars_off -
> -                sizeof(u64));
> +                     dmar_tbl_off - sizeof(u64));
>  
>       /* don't unmap heap because dmar.c needs access to this */
>  

If you are using accessors here, what about dmar_tbl itself?

        -hpa



--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to