Example #1
0
int arch_board_getclock(struct vmm_devtree_node * node, u32 * clock)
{
	if (!node || !clock) {
		return VMM_EFAIL;
	}

	if (vmm_strcmp(node->name, "uart0") == 0) {
		*clock = 24000000;
	} else if (vmm_strcmp(node->name, "uart1") == 0) {
		*clock = 24000000;
	} else {
		*clock = 100000000;
	}

	return VMM_OK;
}
Example #2
0
static int cmd_profile_exec(struct vmm_chardev * cdev, int argc, char **argv)
{
	char *param = NULL;
	int index = 0;

	if (argc > 3) {
		cmd_profile_usage(cdev);
		return VMM_EFAIL;
	}

	if (argc == 3) {
		param = argv[2];
	}

	while (command[index].name) {
		if (vmm_strcmp(argv[1], command[index].name) == 0) {
			return command[index].function(cdev, param);
		}
		index++;
	}

	cmd_profile_usage(cdev);

	return VMM_EFAIL;
}
Example #3
0
static int cmd_vcpu_exec(vmm_chardev_t *cdev, int argc, char **argv)
{
	int id = -1;
	int index = 0;

	if (argc > 3) {
		cmd_vcpu_usage(cdev);
		return VMM_EFAIL;
	}

	if (argc == 3) {
		id = vmm_str2int(argv[2], 10);
	}
	
	while (command[index].name) {
		if (vmm_strcmp(argv[1], command[index].name) == 0) {
			return command[index].function(cdev, id);
		}
		index++;
	}

	cmd_vcpu_usage(cdev);

	return VMM_EFAIL;
}
Example #4
0
int cmd_blockdev_exec(struct vmm_chardev *cdev, int argc, char **argv)
{
	if (argc == 2) {
		if (vmm_strcmp(argv[1], "help") == 0) {
			cmd_blockdev_usage(cdev);
			return VMM_OK;
		} else if (vmm_strcmp(argv[1], "list") == 0) {
			cmd_blockdev_list(cdev);
			return VMM_OK;
		}
	}
	if (argc < 3) {
		cmd_blockdev_usage(cdev);
		return VMM_EFAIL;
	}
	return VMM_OK;
}
Example #5
0
int cmd_buddy_exec(struct vmm_chardev *cdev, int argc, char **argv)
{
	if (argc <= 1) {
		cmd_buddy_usage(cdev);
		return -1;
	}

	if (!vmm_strcmp(argv[1], "state")) {
		buddy_print_state(cdev);
	} else if (!vmm_strcmp(argv[1], "hk-state")) {
		buddy_print_hk_state(cdev);
	} else {
		vmm_cprintf(cdev, "buddy %s: Unknown command.\n");
		cmd_buddy_usage(cdev);
		return -1;
	}

	return VMM_OK;
}
Example #6
0
const char* get_option_val(const cmdline_option_t *options,
                              char vals[][MAX_VALUE_LEN], const char *opt_name)
{
    int i;
    for (i = 0; options[i].name != NULL; i++ ) {
        if ( vmm_strcmp(options[i].name, opt_name) == 0 )
            return vals[i];
    }
    bprint("requested unknown option: %s\n", opt_name);
    return NULL;
}
Example #7
0
static int cmd_profile_name_cmp(void *m, size_t a, size_t b)
{
	struct count_record *ptr = m;
	int result = vmm_strcmp(&ptr[a].function_name[0], &ptr[b].function_name[0]);

	if (result < 0) {
		return 1;
	} else {
		return 0;
	}
}
Example #8
0
int cmd_rtcdev_exec(struct vmm_chardev *cdev, int argc, char **argv)
{
	if (argc == 2) {
		if (vmm_strcmp(argv[1], "help") == 0) {
			cmd_rtcdev_usage(cdev);
			return VMM_OK;
		} else if (vmm_strcmp(argv[1], "list") == 0) {
			cmd_rtcdev_list(cdev);
			return VMM_OK;
		}
	}
	if (argc < 3) {
		cmd_rtcdev_usage(cdev);
		return VMM_EFAIL;
	}
	if (vmm_strcmp(argv[1], "sync_wallclock") == 0) {
		return cmd_rtcdev_sync_wallclock(cdev, argv[2]);
	} else if (vmm_strcmp(argv[1], "sync_device") == 0) {
		return cmd_rtcdev_sync_device(cdev, argv[2]);
	} else if (vmm_strcmp(argv[1], "get_time") == 0) {
		return cmd_rtcdev_get_time(cdev, argv[2]);
	} else if ((vmm_strcmp(argv[1], "set_time") == 0) && argc == 7) {
		return cmd_rtcdev_set_time(cdev, argv[2], argc - 3, &argv[3]);
	}
	cmd_rtcdev_usage(cdev);
	return VMM_EFAIL;
}
Example #9
0
int cmd_ram_exec(vmm_chardev_t *cdev, int argc, char **argv)
{
	int colcnt;
	if (1 < argc) {
		if (vmm_strcmp(argv[1], "help") == 0) {
			cmd_ram_usage(cdev);
			return VMM_OK;
		} else if (vmm_strcmp(argv[1], "stats") == 0) {
			cmd_ram_stats(cdev);
			return VMM_OK;
		} else if (vmm_strcmp(argv[1], "bitmap") == 0) {
			if (2 < argc) {
				colcnt = vmm_str2int(argv[2], 10);
			} else {
				colcnt = 64;
			}
			cmd_ram_bitmap(cdev, colcnt);
			return VMM_OK;
		}
	}
	cmd_ram_usage(cdev);
	return VMM_EFAIL;
}
Example #10
0
struct fdt_property * libfdt_get_property(struct fdt_fileinfo * fdt, 
					  struct fdt_node_header * fdt_node, 
					  const char * property)
{
	u32 len = 0x0;
	struct fdt_property * ret = NULL;
	char * data = NULL;

	/* Sanity checks */
	if (!fdt || !fdt_node || !property) {
		return NULL;
	}

	/* Sanity checks */
	if (fdt_node->tag != FDT_BEGIN_NODE)
		return NULL;

	/* Convert node to character stream */
	data = (char *)fdt_node;
	data += sizeof(fdt_cell_t);

	/* Skip node name */
	len = vmm_strlen(data);
	data += len + 1;
	while ((virtual_addr_t) (data) % sizeof(fdt_cell_t) != 0) {
		data++;
	}

	/* Find node property and its value */
	ret = NULL;
	while (LIBFDT_DATA32(data) == FDT_PROP) {
		data += sizeof(fdt_cell_t);
		len = LIBFDT_DATA32(data);
		data += sizeof(fdt_cell_t);
		if (!vmm_strcmp(&fdt->str[LIBFDT_DATA32(data)], 
				property)) {
			data -= sizeof(fdt_cell_t) * 2;
			ret = (struct fdt_property *)data;
			break;
		}
		data += sizeof(fdt_cell_t);
		data += len;
		while ((virtual_addr_t) (data) % sizeof(fdt_cell_t) != 0) {
			(data)++;
		}
	}

	return ret;
}
Example #11
0
static int cmd_profile_count_cmp(void *m, size_t a, size_t b)
{
	struct count_record *ptr = m;

	if (ptr[a].count < ptr[b].count) {
		return 1;
	} else if (ptr[a].count == ptr[b].count) {
		if (vmm_strcmp
		    (&ptr[a].function_name[0], &ptr[b].function_name[0]) < 0) {
			return 1;
		}
	}

	return 0;
}
Example #12
0
int cmd_memory_exec(struct vmm_chardev *cdev, int argc, char **argv)
{
	u32 tmp;
	physical_addr_t addr, src_addr;
	if (argc < 2) {
		cmd_memory_usage(cdev);
		return VMM_EFAIL;
	} else {
		if (argc == 2) {
			if (vmm_strcmp(argv[1], "help") == 0) {
				cmd_memory_usage(cdev);
				return VMM_OK;
			} else {
				cmd_memory_usage(cdev);
				return VMM_EFAIL;
			}
		} else if (argc < 4) {
			cmd_memory_usage(cdev);
			return VMM_EFAIL;
		}
	}
	addr = (physical_addr_t)vmm_str2ulonglong(argv[2], 10);
	if (vmm_strcmp(argv[1], "dump8") == 0) {
		tmp = vmm_str2ulonglong(argv[3], 10);
		return cmd_memory_dump(cdev, addr, 1, (u32)tmp);
	} else if (vmm_strcmp(argv[1], "dump16") == 0) {
		tmp = vmm_str2ulonglong(argv[3], 10);
		return cmd_memory_dump(cdev, addr, 2, (u32)tmp);
	} else if (vmm_strcmp(argv[1], "dump32") == 0) {
		tmp = vmm_str2ulonglong(argv[3], 10);
		return cmd_memory_dump(cdev, addr, 4, (u32)tmp);
	} else if (vmm_strcmp(argv[1], "modify8") == 0) {
		return cmd_memory_modify(cdev, addr, 1, argc - 3, &argv[3]);
	} else if (vmm_strcmp(argv[1], "modify16") == 0) {
		return cmd_memory_modify(cdev, addr, 2, argc - 3, &argv[3]);
	} else if (vmm_strcmp(argv[1], "modify32") == 0) {
		return cmd_memory_modify(cdev, addr, 4, argc - 3, &argv[3]);
	} else if (vmm_strcmp(argv[1], "copy") == 0 && argc > 4) {
		src_addr = (physical_addr_t)vmm_str2ulonglong(argv[3], 10);
		tmp = vmm_str2uint(argv[4], 10);
		return cmd_memory_copy(cdev, addr, src_addr, tmp);
	}
	cmd_memory_usage(cdev);
	return VMM_EFAIL;
}
Example #13
0
static int cmd_profile_dump(struct vmm_chardev * cdev, char *filter_mode)
{
	int index = 0;
	int (*cmp_function) (void *, size_t, size_t) = cmd_profile_count_cmp;

	if (filter_mode != NULL) {
		cmp_function = NULL;
		while (filters[index].name) {
			if (vmm_strcmp(filter_mode, filters[index].name) == 0) {
				cmp_function = filters[index].function;
				break;
			}
			index++;
		}
	}

	if (cmp_function == NULL) {
		cmd_profile_usage(cdev);
		return VMM_EFAIL;
	}

	kallsyms_on_each_symbol(cmd_profile_count_iterator, count_array);

	libsort_smoothsort(count_array, 0, kallsyms_num_syms, cmp_function,
			   cmd_profile_swap);

	for (index = 0; index < kallsyms_num_syms; index++) {
		if (count_array[index].count) {
			vmm_printf("%-30s %-10u %-10u %u\n",
				   count_array[index].function_name,
				   count_array[index].count,
				   ns_to_micros(count_array[index].total_time),
				   ns_to_micros(count_array[index].time_per_call));
		}
	}

	return VMM_OK;
}
Example #14
0
int cmd_rtcdev_set_time(struct vmm_chardev *cdev, const char * name,
			int targc, char **targv)
{
	int rc;
	char * s;
	struct vmm_rtc_time tm;
	struct vmm_rtcdev * rtc = vmm_rtcdev_find(name);

	if (!rtc) {
		vmm_cprintf(cdev, "Error: cannot find rtc %s\n", name);
		return VMM_EFAIL;
	}

	s = targv[0];
	rc = 0;
	tm.tm_hour = 0;
	tm.tm_min = 0;
	tm.tm_sec = 0;
	while (*s) {
		if (*s == ':') {
			rc++;
		} else if ('0' <= *s && *s <= '9') {
			switch(rc) {
			case 0:
				tm.tm_hour = tm.tm_hour * 10 + (*s - '0');
				break;
			case 1:
				tm.tm_min = tm.tm_min * 10 + (*s - '0');
				break;
			case 2:
				tm.tm_sec = tm.tm_sec * 10 + (*s - '0');
				break;
			default:
				break;
			};
		}
		s++;
	}
	rc = 0;
	tm.tm_mday = vmm_str2int(targv[1], 10);
	vmm_str2lower(targv[2]);
	if (vmm_strcmp(targv[2], "jan") == 0) {
		tm.tm_mon = 0;
	} else if (vmm_strcmp(targv[2], "feb") == 0) {
		tm.tm_mon = 1;
	} else if (vmm_strcmp(targv[2], "mar") == 0) {
		tm.tm_mon = 2;
	} else if (vmm_strcmp(targv[2], "apr") == 0) {
		tm.tm_mon = 3;
	} else if (vmm_strcmp(targv[2], "may") == 0) {
		tm.tm_mon = 4;
	} else if (vmm_strcmp(targv[2], "jun") == 0) {
		tm.tm_mon = 5;
	} else if (vmm_strcmp(targv[2], "jul") == 0) {
		tm.tm_mon = 6;
	} else if (vmm_strcmp(targv[2], "aug") == 0) {
		tm.tm_mon = 7;
	} else if (vmm_strcmp(targv[2], "sep") == 0) {
		tm.tm_mon = 8;
	} else if (vmm_strcmp(targv[2], "oct") == 0) {
		tm.tm_mon = 9;
	} else if (vmm_strcmp(targv[2], "nov") == 0) {
		tm.tm_mon = 10;
	} else if (vmm_strcmp(targv[2], "dec") == 0) {
		tm.tm_mon = 11;
	} else {
		tm.tm_mon = vmm_str2int(targv[2], 10);
	}
	tm.tm_year = vmm_str2int(targv[3], 10) - 1900;

	if (!vmm_rtc_valid_tm(&tm)) {
		vmm_cprintf(cdev, "Error: invalid date-time\n");
		return VMM_EFAIL;
	}

	rc = vmm_rtcdev_set_time(rtc, &tm);
	if (rc) {
		vmm_cprintf(cdev, "Error: set_time failed for rtc %s\n", name);
		return rc;
	}

	return VMM_OK;
}
Example #15
0
int arch_vcpu_regs_init(struct vmm_vcpu * vcpu)
{
	u32 ite, cpuid;
	const char * attr;

	/* Initialize User Mode Registers */
	/* For both Orphan & Normal VCPUs */
	vmm_memset(arm_regs(vcpu), 0, sizeof(arch_regs_t));
	arm_regs(vcpu)->pc = vcpu->start_pc;
	if (vcpu->is_normal) {
		arm_regs(vcpu)->cpsr  = CPSR_ZERO_MASK;
		arm_regs(vcpu)->cpsr |= CPSR_ASYNC_ABORT_DISABLED;
		arm_regs(vcpu)->cpsr |= CPSR_MODE_USER;
	} else {
		arm_regs(vcpu)->cpsr  = CPSR_ZERO_MASK;
		arm_regs(vcpu)->cpsr |= CPSR_ASYNC_ABORT_DISABLED;
		arm_regs(vcpu)->cpsr |= CPSR_MODE_SUPERVISOR;
		arm_regs(vcpu)->sp = vcpu->start_sp;
	}
	/* Initialize Supervisor Mode Registers */
	/* For only Normal VCPUs */
	if (!vcpu->is_normal) {
		return VMM_OK;
	}
	attr = vmm_devtree_attrval(vcpu->node, 
				   VMM_DEVTREE_COMPATIBLE_ATTR_NAME);
	if (vmm_strcmp(attr, "ARMv7a,cortex-a8") == 0) {
		cpuid = ARM_CPUID_CORTEXA8;
	} else if (vmm_strcmp(attr, "ARMv5te,ARM926ej") == 0) {
		cpuid = ARM_CPUID_ARM926;
	} else {
		return VMM_EFAIL;
	}
	if (!vcpu->reset_count) {
		vcpu->arch_priv = vmm_malloc(sizeof(arm_priv_t));
		vmm_memset(arm_priv(vcpu), 0, sizeof(arm_priv_t));
		arm_priv(vcpu)->cpsr = CPSR_ASYNC_ABORT_DISABLED | 
				   CPSR_IRQ_DISABLED |
				   CPSR_FIQ_DISABLED | 
				   CPSR_MODE_SUPERVISOR;
	} else {
		for (ite = 0; ite < CPU_FIQ_GPR_COUNT; ite++) {
			arm_priv(vcpu)->gpr_usr[ite] = 0x0;
			arm_priv(vcpu)->gpr_fiq[ite] = 0x0;
		}
		arm_priv(vcpu)->sp_usr = 0x0;
		arm_priv(vcpu)->lr_usr = 0x0;
		arm_priv(vcpu)->sp_svc = 0x0;
		arm_priv(vcpu)->lr_svc = 0x0;
		arm_priv(vcpu)->spsr_svc = 0x0;
		arm_priv(vcpu)->sp_mon = 0x0;
		arm_priv(vcpu)->lr_mon = 0x0;
		arm_priv(vcpu)->spsr_mon = 0x0;
		arm_priv(vcpu)->sp_abt = 0x0;
		arm_priv(vcpu)->lr_abt = 0x0;
		arm_priv(vcpu)->spsr_abt = 0x0;
		arm_priv(vcpu)->sp_und = 0x0;
		arm_priv(vcpu)->lr_und = 0x0;
		arm_priv(vcpu)->spsr_und = 0x0;
		arm_priv(vcpu)->sp_irq = 0x0;
		arm_priv(vcpu)->lr_irq = 0x0;
		arm_priv(vcpu)->spsr_irq = 0x0;
		arm_priv(vcpu)->sp_fiq = 0x0;
		arm_priv(vcpu)->lr_fiq = 0x0;
		arm_priv(vcpu)->spsr_fiq = 0x0;
		cpu_vcpu_cpsr_update(vcpu, 
				     arm_regs(vcpu), 
				     (CPSR_ZERO_MASK |
					CPSR_ASYNC_ABORT_DISABLED | 
					CPSR_IRQ_DISABLED |
					CPSR_FIQ_DISABLED | 
					CPSR_MODE_SUPERVISOR),
				     CPSR_ALLBITS_MASK);
	}
	if (!vcpu->reset_count) {
		arm_priv(vcpu)->features = 0;
		switch (cpuid) {
		case ARM_CPUID_ARM926:
			arm_set_feature(vcpu, ARM_FEATURE_V4T);
			arm_set_feature(vcpu, ARM_FEATURE_V5);
			arm_set_feature(vcpu, ARM_FEATURE_VFP);
			break;
		case ARM_CPUID_CORTEXA8:
			arm_set_feature(vcpu, ARM_FEATURE_V4T);
			arm_set_feature(vcpu, ARM_FEATURE_V5);
			arm_set_feature(vcpu, ARM_FEATURE_V6);
			arm_set_feature(vcpu, ARM_FEATURE_V6K);
			arm_set_feature(vcpu, ARM_FEATURE_V7);
			arm_set_feature(vcpu, ARM_FEATURE_AUXCR);
			arm_set_feature(vcpu, ARM_FEATURE_THUMB2);
			arm_set_feature(vcpu, ARM_FEATURE_VFP);
			arm_set_feature(vcpu, ARM_FEATURE_VFP3);
			arm_set_feature(vcpu, ARM_FEATURE_NEON);
			arm_set_feature(vcpu, ARM_FEATURE_THUMB2EE);
			break;
		case ARM_CPUID_CORTEXA9:
			arm_set_feature(vcpu, ARM_FEATURE_V4T);
			arm_set_feature(vcpu, ARM_FEATURE_V5);
			arm_set_feature(vcpu, ARM_FEATURE_V6);
			arm_set_feature(vcpu, ARM_FEATURE_V6K);
			arm_set_feature(vcpu, ARM_FEATURE_V7);
			arm_set_feature(vcpu, ARM_FEATURE_AUXCR);
			arm_set_feature(vcpu, ARM_FEATURE_THUMB2);
			arm_set_feature(vcpu, ARM_FEATURE_VFP);
			arm_set_feature(vcpu, ARM_FEATURE_VFP3);
			arm_set_feature(vcpu, ARM_FEATURE_VFP_FP16);
			arm_set_feature(vcpu, ARM_FEATURE_NEON);
			arm_set_feature(vcpu, ARM_FEATURE_THUMB2EE);
			arm_set_feature(vcpu, ARM_FEATURE_V7MP);
			break;
		default:
			break;
		};
	}

#ifdef CONFIG_ARM32_FUNCSTATS
	for (ite=0; ite < ARM_FUNCSTAT_MAX; ite++) {
		arm_priv(vcpu)->funcstat[ite].function_name = NULL;
		arm_priv(vcpu)->funcstat[ite].entry_count = 0;
		arm_priv(vcpu)->funcstat[ite].exit_count = 0;
		arm_priv(vcpu)->funcstat[ite].time = 0;
	}
#endif

	return cpu_vcpu_cp15_init(vcpu, cpuid);
}