When you enter this command, the shell tries to expand the pattern xyz*, and then pass the resulting expanded list to ls as arguments. There is a limit to the length of the list of parameters which may be passed to a program, although it is pretty big. See here
for more information.
I suspect you have a very large number of files which match the pattern xyz*, exceeding this maximum.
The limitation is in bash itself. Don't worry though, you can use other programs to work around this problem. For example, this command should do what you want:
find . -maxdepth 1 -name 'xyz*' -print0 |xargs -r -0 ls
It's ugly, but it works.