static void FindSpecial(input_data *data, char **startp, int *lenp) { char *point = data->point; /* magic sequences are: * "%{" raw block * "/\*" comment * "#include \"" include * The first and last want a newline [\r\n] before, or the start of the * file. */ #define LINE_START(data, point) (point == data->buf || \ (point > data->point && \ (point[-1] == '\r' || point[-1] == '\n'))) while (point < data->max) { if (point[0] == '/' && point[1] == '*') break; if (LINE_START(data, point)) { if (point[0] == '%' && point[1] == '{') break; if (point[0] == '#' && !strncmp(point + 1, "include \"", 9)) break; } point++; } #undef LINE_START *startp = data->point; *lenp = point - data->point; }
void invalidateCacheRange_RAM(vptr_t start, vptr_t end, paddr_t pstart) { vptr_t line; word_t index; /* If the start and end are not aligned to a cache line boundary * then we need to clean the line first to prevent invalidating * bytes we didn't mean to. Calling the functions in this way is * not the most efficient method, but we assume the user will * rarely be this silly */ if (start != LINE_START(start)) { cleanCacheRange_RAM(start, start, pstart); } if (end + 1 != LINE_START(end + 1)) { line = LINE_START(end); cleanCacheRange_RAM(line, line, pstart + (line - start)); } /** GHOSTUPD: "((gs_get_assn cap_get_capSizeBits_'proc \<acute>ghost'state = 0 \<or> \<acute>end - \<acute>start <= gs_get_assn cap_get_capSizeBits_'proc \<acute>ghost'state) \<and> \<acute>start <= \<acute>end \<and> \<acute>pstart <= \<acute>pstart + (\<acute>end - \<acute>start), id)" */ /* Invalidate L2 range. Invalidating the L2 before the L1 is the order * given in the l2c_310 manual, as an L1 line might be allocated from the L2 * before the L2 can be invalidated. */ plat_invalidateL2Range(pstart, pstart + (end - start)); /** GHOSTUPD: "((gs_get_assn cap_get_capSizeBits_'proc \<acute>ghost'state = 0 \<or> \<acute>end - \<acute>start <= gs_get_assn cap_get_capSizeBits_'proc \<acute>ghost'state) \<and> \<acute>start <= \<acute>end \<and> \<acute>pstart <= \<acute>pstart + (\<acute>end - \<acute>start), id)" */ /* Now invalidate L1 range */ for (index = LINE_INDEX(start); index < LINE_INDEX(end) + 1; index++) { line = index << L1_CACHE_LINE_SIZE_BITS; invalidateByVA(line, pstart + (line - start)); } /* Ensure invalidate completes */ dsb(); }
/* Executed with allocation lock. */ static char refill_cache(refill_data * client_data) { register lf_state * state = client_data -> state; register size_t file_pos = client_data -> file_pos; FILE *f = state -> lf_file; size_t line_start = LINE_START(file_pos); size_t line_no = DIV_LINE_SZ(MOD_CACHE_SZ(file_pos)); cache_line * new_cache = client_data -> new_cache; if (line_start != state -> lf_current && fseek(f, line_start, SEEK_SET) != 0) { ABORT("fseek failed"); } if (fread(new_cache -> data, sizeof(char), LINE_SZ, f) <= file_pos - line_start) { ABORT("fread failed"); } new_cache -> tag = DIV_LINE_SZ(file_pos); /* Store barrier goes here. */ ATOMIC_WRITE(state -> lf_cache[line_no], new_cache); state -> lf_current = line_start + LINE_SZ; return(new_cache->data[MOD_LINE_SZ(file_pos)]); }