static int wait_hydra_output(gpointer data) { static int stdout_ok = TRUE, stderr_ok = TRUE; fd_set rset; struct timeval tv; int result, max; int *fd = data; int status; g_assert((stdout_ok == TRUE) || (stderr_ok == TRUE)); tv.tv_sec = 0; tv.tv_usec = 0; FD_ZERO(&rset); max = -1; if (stdout_ok) { FD_SET(fd[0], &rset); max = fd[0]; } if (stderr_ok) { FD_SET(fd[1], &rset); if (-1 == max) max = fd[1]; else max = fd[0] > fd[1] ? fd[0] : fd[1]; } result = select(max + 1, &rset, NULL, NULL, &tv); if (result < 0) g_error("wait_hydra_output: select returned negative!"); else if (result == 0) return TRUE; if (stdout_ok && FD_ISSET(fd[0], &rset)) stdout_ok = read_into(fd[0]); if (stderr_ok && FD_ISSET(fd[1], &rset)) stderr_ok = read_into(fd[1]); if (!(stdout_ok || stderr_ok)) { waitpid(hydra_pid, &status, 0); hydra_pid = 0; stdout_ok = stderr_ok = TRUE; return FALSE; } else return TRUE; }
int read_into(int fd) { char in_buf[BUF_S]; char *passline; char *start, *end; int result; GtkWidget *output; GtkTextBuffer *outputbuf; GtkTextIter outputiter; if ((result = read(fd, in_buf, BUF_S - 1)) < 0) { g_warning("%s::%i: read returned negative!", __FILE__, __LINE__); return FALSE; } else if (result == 0) { return FALSE; } else { in_buf[result] = 0; } output = lookup_widget(GTK_WIDGET(wndMain), "txtOutput"); outputbuf = gtk_text_view_get_buffer((GtkTextView *) output); gtk_text_buffer_get_iter_at_offset(outputbuf, &outputiter, -1); if ((passline = strstr(in_buf, "password: "******"bold", NULL); if (end - in_buf - result > 0) { gtk_text_buffer_insert(outputbuf, &outputiter, end + 1, -1); } } if (strstr(in_buf, " finished at ") != NULL) { gtk_text_buffer_insert_with_tags_by_name(outputbuf, &outputiter, "<finished>\n\n", -1, "bold", NULL); } if (result == BUF_S - 1) /* there might be more available, recurse baby! */ return read_into(fd); else return TRUE; }
static ssize_t set_volt_table(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct exynos_context *platform = (struct exynos_context *)pkbdev->platform_context; int max = gpu_dvfs_get_level(platform->gpu_max_clock); int min = gpu_dvfs_get_level(platform->gpu_min_clock); int i, tokens, rest, target; int t[min - max]; unsigned long flags; if ((tokens = read_into((int*)&t, min-max, buf, count)) < 0) return -EINVAL; target = -1; if (tokens == 2) { for (i = max; i <= min; i++) { if (t[0] == platform->table[i].clock) { target = i; break; } } } spin_lock_irqsave(&platform->gpu_dvfs_spinlock, flags); if (tokens == 2 && target > -1) { if ((rest = t[1] % GPU_VOLT_STEP) != 0) t[1] += GPU_VOLT_STEP - rest; sanitize_min_max(t[1], GPU_MIN_VOLT, GPU_MAX_VOLT); platform->table[target].voltage = t[1]; } else { for (i = 0; i < tokens; i++) { if ((rest = t[i] % GPU_VOLT_STEP) != 0) t[i] += GPU_VOLT_STEP - rest; sanitize_min_max(t[i], GPU_MIN_VOLT, GPU_MAX_VOLT); platform->table[i + max].voltage = t[i]; } } ipa_update(); spin_unlock_irqrestore(&platform->gpu_dvfs_spinlock, flags); return count; }
static ssize_t set_volt_table(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct kbase_device *kbdev; struct exynos_context *platform; int max = 0; /* max DVFS level (100MHz) */ int min = 7; /* min DVFS level (677MHz) */ int i, tokens, rest, target; int t[min - max]; unsigned long flags; kbdev = dev_get_drvdata(dev); platform = (struct exynos_context *)kbdev->platform_context; if ((tokens = read_into((int*)&t, min-max, buf, count)) < 0) return -EINVAL; target = -1; if (tokens == 2) { for (i = max; i <= min; i++) { if (t[0] == platform->table[i].clock) { target = i; break; } } } spin_lock_irqsave(&platform->gpu_dvfs_spinlock, flags); if (tokens == 2 && target > -1) { sanitize_min_max(t[1], 600000, 1150000); if ((rest = t[1] % 6250) != 0) t[1] += 6250-rest; platform->table[target].voltage = t[1]; } else { for (i = 0; i < tokens; i++) { if ((rest = t[1] % 6250) != 0) t[1] += 6250-rest; sanitize_min_max(t[i], 600000, 1150000); platform->table[i + max].voltage = t[i]; } } ipa_update(); spin_unlock_irqrestore(&platform->gpu_dvfs_spinlock, flags); return count; }
static ssize_t volt_table_store(struct device *d, struct device_attribute *a, const char *buf, size_t count) { int i, t; int u[GPU_DVFS_MAX_LEVEL]; if ((t = read_into((int*)&u, GPU_DVFS_MAX_LEVEL, buf, count)) < 0) return -EINVAL; if ((t == 2) && (GPU_DVFS_MAX_LEVEL != 2)) { if ((i = sec_gpu_dvfs_level_from_clk_get(u[0])) < 0) return -EINVAL; gdata[i].voltage = sanitize_voltage(u[1]); } else if (t == GPU_DVFS_MAX_LEVEL) { for(i = 0; i < GPU_DVFS_MAX_LEVEL; i++) gdata[i].voltage = sanitize_voltage(u[i]); } else return -EINVAL; return count; }