unsigned long end;
};
-static void kmem_info_fill(struct kmem_info *info, struct mm_struct *mm)
+#if defined(CONFIG_ARM64) || defined(CONFIG_X86_32)
+static void kmem_info_fill_common(struct kmem_info *info, struct task_struct *task)
{
-#if defined(CONFIG_ARM)
- info->name = "[vectors]";
- info->start = CONFIG_VECTORS_BASE;
- info->end = CONFIG_VECTORS_BASE + PAGE_SIZE;
-#elif defined(CONFIG_ARM64)
- /* FIXME: for aarch64 mode */
- info->name = "[vectors]";
- info->start = AARCH32_VECTORS_BASE;
- info->end = AARCH32_VECTORS_BASE + PAGE_SIZE;
-#elif defined(CONFIG_X86_32)
unsigned long vdso;
struct vm_area_struct *vma_vdso;
- vdso = (unsigned long)mm->context.vdso;
- vma_vdso = find_vma_intersection(mm, vdso, vdso + 1);
+ vdso = (unsigned long)task->mm->context.vdso;
+ vma_vdso = find_vma_intersection(task->mm, vdso, vdso + 1);
if (vma_vdso) {
info->name = "[vdso]";
info->start = vma_vdso->vm_start;
info->end = vma_vdso->vm_end;
} else {
- printk(USM_PREFIX "Cannot get VDSO mapping\n");
-
+ pr_err(USM_PREFIX "Cannot get VDSO mapping\n");
info->name = NULL;
info->start = 0;
info->end = 0;
}
+}
+#endif /* defined(CONFIG_ARM64) || defined(CONFIG_X86_32) */
+
+static void kmem_info_fill(struct kmem_info *info, struct task_struct *task)
+{
+#if defined(CONFIG_ARM)
+ info->name = "[vectors]";
+ info->start = CONFIG_VECTORS_BASE;
+ info->end = CONFIG_VECTORS_BASE + PAGE_SIZE;
+#elif defined(CONFIG_ARM64)
+ if (test_ti_thread_flag(task_thread_info(task), TIF_32BIT)) {
+ info->name = "[vectors]";
+ info->start = AARCH32_VECTORS_BASE;
+ info->end = AARCH32_VECTORS_BASE + PAGE_SIZE;
+ } else {
+ kmem_info_fill_common(info, task);
+ }
+#elif defined(CONFIG_X86_32)
+ kmem_info_fill_common(info, task);
#endif /* CONFIG_arch */
}
return ret + sizeof(*obj);
}
-static int pack_shared_kmem(void *data, size_t size, struct mm_struct *mm)
+static int pack_shared_kmem(void *data, size_t size, struct task_struct *task)
{
struct lib_obj *obj = (struct lib_obj *)data;
struct kmem_info info;
if (size < sizeof(*obj))
return -ENOMEM;
- kmem_info_fill(&info, mm);
+ kmem_info_fill(&info, task);
if (info.name == NULL)
return 0;
return obj_size;
}
-static int pack_libs(void *data, size_t size, struct mm_struct *mm)
+static int pack_libs(void *data, size_t size, struct task_struct *task)
{
int ret;
struct vm_area_struct *vma;
size -= sizeof(*lib_cnt);
/* packing libraries */
- for (vma = mm->mmap; vma; vma = vma->vm_next) {
+ for (vma = task->mm->mmap; vma; vma = vma->vm_next) {
if (check_vma(vma)) {
ret = pack_lib_obj(data, size, vma);
if (ret < 0)
}
/* packing shared kernel memory */
- ret = pack_shared_kmem(data, size, mm);
+ ret = pack_shared_kmem(data, size, task);
if (ret < 0)
return ret;
data += ret;
size -= ret;
- ret = pack_libs(data, size, task->mm);
+ ret = pack_libs(data, size, task);
if (ret < 0)
return ret;