diff --git a/linux-ramdump-parser-v2/parsers/cbmem.py b/linux-ramdump-parser-v2/parsers/cbmem.py
new file mode 100644
index 0000000000000000000000000000000000000000..f1973e7e25822f3ebb2239d55626d56e4e60b67a
--- /dev/null
+++ b/linux-ramdump-parser-v2/parsers/cbmem.py
@@ -0,0 +1,65 @@
+# Copyright (c) 2018, The Linux Foundation. All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 and
+# only version 2 as published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+from parser_util import cleanupString
+from parser_util import register_parser, RamParser
+from print_out import print_out_str
+
+# This is hardcoded since coreboot console is always at below physical address
+#addr1 = 0xfffde000
+#len1 = 0x20000
+CBMC_CURSOR_MASK = ((1 << 28) - 1)
+CBMC_OVERFLOW = (1 << 31)
+
+@register_parser('--cbmem', 'Print the coreboot console log', shortopt='-z')
+class CBMEM(RamParser):
+
+
+    def print_cbmem(self, cbmem_out):
+        #get starting address of cbmem_console
+        #get the size of console
+        cbmem_console_addr = self.ramdump.read_u64('cbmem_console')
+        cbmem_console_size = self.ramdump.read_u16('cbmem_console_size')
+        if (cbmem_console_addr is None) or (cbmem_console_size is None):
+            print_out_str('cbmem_console stucture not found')
+            return
+        #read the valie of cbmem_console->cursor.  getting offset and reading u32
+        cursor_offset = self.ramdump.field_offset('struct cbmem_cons', 'cursor')
+        cbmem_console_cusor = self.ramdump.read_u16(cbmem_console_addr+cursor_offset)
+
+        #convert the console address to Phy and read full untill size
+        addr = self.ramdump.virt_to_phys(cbmem_console_addr)
+        cbmem = self.ramdump.read_physical(addr, cbmem_console_cusor+8)
+        size = self.ramdump.sizeof('struct cbmem_console')
+        cursor = cbmem_console_cusor & CBMC_CURSOR_MASK
+        if (not(cbmem_console_cusor & CBMC_OVERFLOW) and cursor < cbmem_console_size):
+            size = cursor
+        else:
+            size = cbmem_console_size
+        if (cbmem_console_cusor & CBMC_OVERFLOW):
+            if (cursor >= size):
+                print_out_str("cbmem: ERROR: CBMEM console struct is illegal, "
+                       "output may be corrupt or out of order!\n\n")
+                cursor = 0
+            cbmem = self.ramdump.read_physical(addr+cursor, size-cursor)
+            cbmemPart1 = self.ramdump.read_physical(addr, cursor)
+            cbmem_out.write(cleanupString(cbmem.decode('ascii', 'ignore')) + '\n')
+            cbmem_out.write(cleanupString(cbmemPart1.decode('ascii', 'ignore')) + '\n')
+        else:
+            cbmem = self.ramdump.read_physical(addr, size)
+            cbmem_out.write(cleanupString(cbmem.decode('ascii', 'ignore')) + '\n')
+
+            print_out_str('Wrote Coreboot console log to cbmem.txt')
+    def parse(self):
+        cbmem_out = self.ramdump.open_file('cbmem.txt')
+        self.print_cbmem(cbmem_out)
+        cbmem_out.close()
+