# # Copyright (C) 2017 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # from vts.testcases.kernel.api.proc import KernelProcFileTestBase from vts.testcases.kernel.api.proc.KernelProcFileTestBase import repeat_rule, literal_token class ProcVmallocInfoTest(KernelProcFileTestBase.KernelProcFileTestBase): '''/proc/vmallocinfo provides info on vmalloc'd ranges.''' start = 'lines' def t_CALLER(self, t): '[^ ^\t^\n^-^=^+^/]+\+0x[a-f0-9]+/0x[a-f0-9]+' t.value = t.value.split('+') return t t_PAGES = literal_token('pages') t_IOREMAP = literal_token('ioremap') t_MODULE = literal_token('\[[^\n^\0]*\]') t_VMALLOC = literal_token('vmalloc') t_VMAP = literal_token('vmap') t_USER = literal_token('user') t_VPAGES = literal_token('vpages') t_VM_AREA = literal_token('vm_area') t_UNPURGED = literal_token('unpurged') t_VM_MAP_RAM = literal_token('vm_map_ram') t_DMA_COHERENT = literal_token('dma-coherent') t_ignore = ' ' def t_PHYS(self, t): r'phys=(0x)?[a-f0-9]+' t.value = [t.value[:4], int(t.value[5:], 16)] return t def t_NODES(self, t): r'N[0-9]+=[1-9][0-9]*' t.value = t.value.split('=', 1) return t p_lines = repeat_rule('line') p_nodes = repeat_rule('node') def p_line(self, p): 'line : addr_range NUMBER caller module pages phys ioremap vmalloc vmap user dma_coherent vpages vm_vm_area nodes NEWLINE' p[0] = p[1:] def p_addr_range(self, p): 'addr_range : HEX_LITERAL DASH HEX_LITERAL' p[0] = [p[1], p[3]] def p_module(self, p): '''module : MODULE | empty''' p[0] = p[1] def p_pages(self, p): '''pages : PAGES EQUALS NUMBER | empty''' p[0] = [] if len(p) == 2 else [p[1], p[3]] def p_phys(self, p): '''phys : PHYS | empty''' p[0] = p[1] def p_ioremap(self, p): '''ioremap : IOREMAP | empty''' p[0] = p[1] def p_vmalloc(self, p): '''vmalloc : VMALLOC | empty''' p[0] = p[1] def p_dma_coherent(self, p): '''dma_coherent : DMA_COHERENT | empty''' p[0] = p[1] def p_vmap(self, p): '''vmap : VMAP | empty''' p[0] = p[1] def p_user(self, p): '''user : USER | empty''' p[0] = p[1] def p_vpages(self, p): '''vpages : VPAGES | empty''' p[0] = p[1] def p_vm_vm_area(self, p): '''vm_vm_area : UNPURGED VM_AREA | VM_MAP_RAM | empty''' if len(p) == 2: p[0] = [] else: p[0] = p[1:] def p_node(self, p): '''node : NODES | empty''' p[0] = [1] def p_caller(self, p): '''caller : CALLER | HEX_LITERAL | empty''' p[0] = p[1] def get_path(self): return "/proc/vmallocinfo"